【问题标题】:Format a date in C++在 C++ 中格式化日期
【发布时间】:2010-07-16 09:52:13
【问题描述】:

我有一系列格式为:“30-05-2001”的日期字符串

string date1 = "30-05-2001";

我想将日期解析为日、月、年。现在一个简单的方法 这样做只是调用函数 sscanf。但我想 探索其他可能性,并从网上搜索以下内容 推荐使用 time.h 中的函数:

char *strptime(const char *buf, const char *format, struct tm *tm); 

有没有人有使用这个功能的经验?一些简短的例子是 很有帮助。

谢谢!

【问题讨论】:

  • 看看Boost.Date_Time。粗略一瞥,我看不出如何让美国格式正常工作。
  • 如果你这样做的话,我会建议一个支持 sscanf() 的 std::istringstream 对象。 strptime() 不是 ISO 标准 / 的一部分,因此不会得到普遍支持。

标签: c++ datetime formatting


【解决方案1】:
std::istringstream buffer("30-05-2001");
int day = 0;
int month = 0;
int year = 0;
char dummy = 0;

buffer >> day >> dummy >> month >> dummy >> year;
// TODO: validate values here

如果您还想验证 dummy 是否等于 '-',您可以对数据执行不同的读取。

【讨论】:

    【解决方案2】:

    以防万一您想了解它是如何工作的(没有黑盒)或 如果你需要飞行的东西(没有函数调用)那么这里有一个 给你的一些提示:

    //             0123456789
    char date[] = "30-05-2001"; // DD-MM-YYYY
    int day, month, year;
    
    day = (date[0] - '0') * 10 + (date[1] - '0');
    month = (date[3] - '0') * 10 + (date[4] - '0');
    year = (date[6] - '0') * 1000 + (date[7] - '0') * 100 + (date[8] - '0') * 10 + (date[9] - '0');
    

    这个(未经测试的)代码更适合做你想做的事 想做,因为它只做你需要做的事情(不是更多,不是 较少的)。安全、小巧、简单、快速。

    如果您不确定日期(用户输入),那么您必须 检查其有效性(或接受与无效一起生活的想法 申请中的日期)。

    【讨论】:

      【解决方案3】:

      Source

      #include <time.h>
      ...
      
      
      struct tm tm;
      time_t t;
      
      
      if (strptime("6 Dec 2001 12:33:45", "%d %b %Y %H:%M:%S", &tm) == NULL)
          /* Handle error */;
      
      
      printf("year: %d; month: %d; day: %d;\n",
              tm.tm_year, tm.tm_mon, tm.tm_mday);
      printf("hour: %d; minute: %d; second: %d\n",
              tm.tm_hour, tm.tm_min, tm.tm_sec);
      printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday);
      
      
      tm.tm_isdst = -1;      /* Not set by strptime(); tells mktime()
                                to determine whether daylight saving time
                                is in effect */
      t = mktime(&tm);
      if (t == -1)
          /* Handle error */;
      printf("seconds since the Epoch: %ld\n", (long) t);"
      

      【讨论】:

      • strptime() 不是 C++ 的一部分。
      • @Georg:你是对的;但这可能有助于 Windows 等效 stackoverflow.com/questions/321849/…
      • @Georg:您的意思是“不是 ISO C++ 标准库的一部分”,这样更准确。就此而言,它也不是 ISO C 标准库的一部分。从可移植性的角度来看,这是一个公平的观点,但既然这是 OP 的建议,也许应该反对他的帖子?但是,如果目标库提供了它,则可以使用它。建议任何代码都不应使用第三方库或标准库扩展,这将过于严格。按照这种逻辑,操作系统 API 也会越界!
      • @cli:我的意思不是 “标准 C++” 中的 C++ 的一部分,就像 “C++ 标准” 中的那样。好的,我忽略了 OP 也确实有这个......你似乎已经纠正了这一点。但是,在发布答案时,我认为应该指出非标准解决方案,仅此而已 - 我没有说“不要发布它”
      • @Georg:你似乎误解了我的意思。我理解你的意图,但你的说法不准确。语言和库是不同的实体。该语言旨在通过使用库进行扩展;它们的使用不会使代码“非标准”——它将在任何兼容的编译器中编译,该库可用于该编译器。正如您所说,警告不可移植使用是有帮助的,但从您的重申看来,您不接受语言和库之间的区别,因为您重复了同样的错误。
      【解决方案4】:

      有关示例,请参阅 here。也很好地解释了如何使用转换说明符等。

      编辑:KMan 更快:)

      Edit2:链接导致描述

      char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm);
      

      还有一个关于如何使用的简短示例。 本站由

      提供

      开放组基本规范 第 6 期 IEEE Std 1003.1, 2004 版

      【讨论】:

      • 请至少提供一个摘要,而不仅仅是一个链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2011-11-12
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多