【问题标题】:C++ date and timeC++ 日期和时间
【发布时间】:2012-09-02 23:58:54
【问题描述】:

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

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

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

我看到有一个 TMonthCalendar 控件。我想在制作表单应用程序时使用此控件。因此,该控件使用什么格式的日期?我想在制作类的时候使用和控件相同的类型,这样我可以很容易的集成在一起。

更新

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

【问题讨论】:

  • 我建议获取一些日期时间库。见boost.datetime
  • 使用 boost 库,或者为您需要的操作系统“日期”函数编写一个简单的类包装器。如果要保存到数据库,请使用“DateTime”,否则使用字符串(可能是 JSON 字符串,可能是 XML 字符串,或者可能只是一个平面文件)可以读取和写入日期。

标签: c++ datetime


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    没有。即使是简单的事情,例如在您有会议开始和结束日期的情况下计算持续时间,也需要考虑复杂的事情,例如闰年。

    我应该编写还是学习日期/时间课程?

    没有。编写日期/时间库似乎很简单,但要正确却相当困难,极容易出错。此外,其他人以前也做过 - boost is a collection of free libraries with stellar reputation。事实上,还有很多其他人,以至于新手程序员想要编写日期/时间库已成为陈词滥调,failinghorriblyatit

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多