2012-09-10 75 views
8

Estoy desarrollando una aplicación de citas en C++ y quiero usar algunas características de fecha y hora.C++ fecha y hora

¿Es más fácil simplemente usar cadenas cuando se habla de fecha y hora, o debo escribir u obtener una clase de fecha/hora?

Quiero codificar una clase de cita que tenga tanto la hora como la fecha de una cita. Una vez que he codificado el archivo de clase, quiero integrarlo en una aplicación de formularios en C++ builder.

Veo que hay un control TMonthCalendar. Me gustaría utilizar este control al hacer la aplicación de formularios. Como tal, ¿qué formato para la fecha utiliza este control? Me gustaría usar el mismo tipo de control cuando hago la clase para poder integrarlo fácilmente.

ACTUALIZACIÓN

he encontrado que utiliza el tipo de TDateTime. Mi pregunta es esta: ¿Qué declaración de inclusión debo usar para usar esto en una aplicación de consola?

+4

Sugiero obtener alguna biblioteca de fecha y hora. Ver [boost.datetime] (http://www.boost.org/doc/libs/1_51_0/doc/html/date_time.html). – juanchopanza

+0

Vaya con la biblioteca de impulso, o escriba un envoltorio de clase simple para las funciones de "fecha" del sistema operativo que necesita. Usando "DateTime" si está guardando en una base de datos, de lo contrario, puede usar una cadena (quizás una cadena JSON, quizás una cadena XML, o quizás solo un archivo plano) para leer y escribir sus fechas. – paulsm4

Respuesta

14

C++ 11 incluye convenientes tipos de datos y funciones para representaciones de fecha/hora, así como su conversión a cadenas.

Con esto, se pueden hacer cosas como esta (bastante auto-explicativo, creo):

#include <iostream> 
#include <iomanip> 
#include <ctime> 

int main() 
{ 
    std::time_t t = std::time(NULL); 
    std::tm tm = *std::localtime(&t); 
    std::cout << "Time right now is " << std::put_time(&tm, "%c %Z") << '\n'; 
} 

En particular, hay tipos de datos std::time_t y std::tm, y un muy buen manipulador IO std::put_time para bonito impresión. Las cadenas de formato utilizadas están bien documentadas en cppreference.

Esto también se supone que funciona bien junto con las configuraciones regionales, p. para un japonés formato de hora/fecha:

std::cout.imbue(std::locale("ja_JP.utf8")); 
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n'; 

La biblioteca chrono incluido en la biblioteca estándar de C++ 11 también le permite hacer aritmética simple de hora/fecha convenientemente:

std::chrono::time_point<std::chrono::system_clock> now; 
now = std::chrono::system_clock::now(); 
/* The day before today: */ 
std::time_t now_c = std::chrono::system_clock::to_time_t(
     now - std::chrono::hours(24)); 

Por desgracia, no todo esto está disponible en todos los compiladores. En particular, la función std::put_time no parece estar disponible todavía en GCC 4.7.1. Para obtener el código le di inicialmente a trabajar, tuve que usar el un poco menos elegante std::strftime función:

#include <iostream> 
#include <iomanip> 
#include <ctime> 

int main() 
{ 
    std::time_t t = std::time(NULL); 
    std::tm tm = *std::localtime(&t); 

    constexpr int bufsize = 100; 
    char buf[bufsize]; 
    if (std::strftime(buf,bufsize,"%c %Z",&tm) != 0) 
     std::cout << "Time right now is " << buf << std::endl; 
} 
1

es más fácil, sólo tiene que utilizar cuerdas cuando se habla de fecha y hora?

No, incluso cosas tan simples como calcular una duración si tiene una fecha de inicio y finalización de la reunión deben tener en cuenta cosas complejas como los años bisiestos.

¿Debo escribir o recibir una clase de fecha/hora?

Nº Escribir un Fecha/Hora Biblioteca parece simple, pero es bastante difícil hacerlo bien y muy fácil equivocarse. Además, otros lo han hecho antes - boost is a collection of free libraries with stellar reputation.De hecho, hay tantos otros que se ha convertido en un cliché que los programadores noveles quieren escribir una biblioteca de fecha/hora, failinghorriblyatit.

Veo que hay un control TMonthCalendar. [...] He encontrado que usa el tipo TDateTime.

Confiar en la misma clase de Fecha/Hora que su marco de interfaz gráfica de usuario está bien, pero si más adelante cambia el marco de la GUI puede convertirse en un problema. Dado que no es muy difícil intercambiar una biblioteca sensible de Fecha/Hora por otra biblioteca sensible de Fecha/Hora más tarde, simplemente use una que encuentre fácil de usar.