【问题标题】:Directly setting values of struct tm's attributes not working直接设置 struct tm 属性的值不起作用
【发布时间】:2015-08-26 22:39:36
【问题描述】:

为什么asctime(ptr) 什么都不返回?结构的所有变量都有值。有人可以解释为什么会这样吗?

我也尝试过使用strftime,但结果是一样的。

#include <iostream>
#include <ctime>
#include <new>
//#include <cstdio>

using namespace std;

int main(int argc,char *argv[])
{
    struct tm *ptr=new struct tm;
    //char buf[50];

    ptr->tm_hour=0;
    ptr->tm_mon=0;
    ptr->tm_year=0;
    ptr->tm_mday=0;
    ptr->tm_sec=0;
    ptr->tm_yday=0;
    ptr->tm_isdst=0;
    ptr->tm_min=0;
    ptr->tm_wday=0;

    cout << asctime(ptr);
    //strftime(buf,sizeof(char)*50,"%D",ptr);
    //printf("%s",buf);

    return 0;
}

【问题讨论】:

  • return nothing 到底是什么?
  • 什么都不返回是什么意思?此外,对于tm 结构的某些成员,0 不是有效值。在这种情况下,它将返回 NULL
  • mday 不能为 0 你是对的...谢谢

标签: c++ c strftime ctime


【解决方案1】:

以下程序有效。用 1 去掉零就可以了。

    struct tm *ptr = new struct tm();
char buf[50];

ptr->tm_hour = 1;
ptr->tm_mon = 1;
ptr->tm_year = 1;
ptr->tm_mday = 1;
ptr->tm_sec = 1;
ptr->tm_yday = 1;
ptr->tm_isdst = 1;
ptr->tm_min = 1;
ptr->tm_wday = 1;
cout << asctime(ptr)

这也有效:

 ptr->tm_hour = 0;
ptr->tm_mon = 0;
ptr->tm_year = 0;
ptr->tm_mday = 1;
ptr->tm_sec = 0;
ptr->tm_yday = 0;
ptr->tm_isdst = 0;
ptr->tm_min = 0;
ptr->tm_wday = 0;

cout << asctime(ptr);

【讨论】:

  • 不是所有属性的有效值为零吗?为什么它不能使用零?
  • AFAIK 日月参数不能设置为零。我会建议做一些谷歌做一些找出来
  • @matts : 编辑了答案!!
  • @Spanky:月份的编码是 0 = 一月到 11 = 十二月(所以你可以有一个月份名称数组,在索引 0 处没有虚拟条目)。月份中的日期应为 1..31。设置 tm_year = 0 表示 1900 年;年份被 1900 抵消。运行mktime(ptr); 然后打印结构可能会提供信息;标准化值。
【解决方案2】:

如果struct tm 的任何成员超出其正常范围,则asctime 的行为未定义。

特别是如果日历日小于 0,则行为未定义(某些实现将 tm_mday==0 处理为表示上个月的最后一天)。

查看http://en.cppreference.com/w/cpp/chrono/c/asctimehttp://en.cppreference.com/w/cpp/chrono/c/tm 了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多