2012-09-10 69 views
8

我正在C++中开发Appointment应用程序,并且想要使用某些日期和时间功能。C++日期和时间

谈论日期和时间时是否更容易使用字符串,还是应该编写或获取日期/时间类?

我想编写一个约会约会的时间和日期的约会类。一旦我编写了类文件,我想要将它集成到C++ builder中的表单应用程序中。

我看到有一个TMonthCalendar控件。我想在制作表单应用程序时使用这个控件。因此,该控件使用什么格式的日期?我想在制作课程时使用与控件相同的类型,以便我可以轻松地将它们集成到一起。

UPDATE

我发现它使用了TDateTime类型类型。我的问题是:我需要在控制台应用程序中使用哪些包含声明?

+4

我建议得到一些日期时间库。请参阅[boost.datetime](http://www.boost.org/doc/libs/1_51_0/doc/html/date_time.html)。 – juanchopanza

+0

使用boost库,或为您需要的操作系统“日期”函数编写简单的类封装器。如果要保存到数据库,使用“DateTime”,否则使用字符串(可能是JSON字符串,也许是XML字符串,或者可能只是一个平面文件)可以读取和写入日期。 – paulsm4

回答

14

C++ 11包含日期/时间表示的便利数据类型和函数,以及它们向字符串的转换。

有了这一点,你可以做这样的事情(不言自明,我认为):

#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'; 
} 

特别是,有数据类型std::time_tstd::tm,以及漂亮的一个很不错的IO操纵std::put_time打印。它使用的格式字符串在cppreference有详细记录。

这也可以与地区一起使用,例如,为日本时间/日期格式:

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

包含在C++ 11标准库的chrono库还可以让你做简单的时间/日期计算方便:

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)); 

不幸的是,不所有这些在所有编译器中都可用。特别是,std::put_time函数似乎还没有在GCC 4.7.1中可用。为了让我给最初的工作,我只好用略少优雅std::strftime函数的代码:

#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

谈论的日期和时间是很容易,只需使用字符串?

不,即使是简单的事情,如计算持续时间(如果您有会议开始和结束日期),也需要考虑诸如闰年之类的复杂事情。

我应该写或获得日期/时间类吗?

号编写日期/时间库似乎很简单,但它很难得到的权利和非常容易出错。此外,其他人已经完成了 - boost is a collection of free libraries with stellar reputation。事实上,还有很多其他人,新手程序员想写一个日期/时间库,成为一种陈词滥调,failinghorriblyatit

我看到有一个TMonthCalendar控件。 [...]我发现它使用TDateTime类型。

依赖于您的GUI框架相同的日期/时间类是好的,但如果您以后更改GUI框架,它可能成为一个问题。因为稍后将一个合理的日期/时间库换成另一个明智的日期/时间库并不难,只需使用一个容易使用的库。