9

我正在用 C++ 开发约会应用程序,并想使用一些日期和时间功能。

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

我想编写一个包含约会时间和日期的约会类。编写完类文件后,我想将其集成到 C++ 构建器中的表单应用程序中。

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

更新

我发现它使用 TDateTime 类型。我的问题是:我需要使用什么包含语句才能在控制台应用程序中使用它?

4

2 回答 2

15

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_t和,以及用于漂亮打印std::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';

chronoC++11 标准库中包含的库还允许您方便地进行简单的时间/日期运算:

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;
}
于 2012-09-10T06:43:30.737 回答
1

在谈论日期和时间时只使用字符串更容易吗?

不可以。即使是简单的事情,比如如果你有会议开始和结束日期计算持续时间,也需要考虑复杂的事情,比如闰年。

我应该写还是上日期/时间课程?

不。编写一个日期/时间库看起来很简单,但要正确却相当困难,而且极容易出错。此外,其他人以前也这样做过——boost 是一系列享有盛誉的免费图书馆。事实上,还有很多其他人,以至于新手程序员想要编写一个日期/时间库,但这方面却失败了,这已成为 陈词滥调

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

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

于 2015-10-16T15:44:55.033 回答