【问题标题】:strftime doesnt display year correctlystrftime 不能正确显示年份
【发布时间】:2010-04-05 14:29:01
【问题描述】:

我有以下代码:

const char* timeformat = "%Y-%m-%d %H:%M:%S";
const int timelength = 20;
char timecstring[timelength];

strftime(timecstring, timelength, timeformat, currentstruct);

cout << "timecstring is: " << timecstring << "\n";

currentstruct 是一个 tm*。 cout 以正确的格式给我日期,但年份不是 2010 年,而是 3910 年。我知道从 1900 年开始的年份与年份有关,但我不确定如何让 strftime 识别这一点而不是将 1900 添加到 2010 的值上,任何人都可以帮忙。

问候

保罗

【问题讨论】:

  • 这完全取决于您如何填充 currentstruct。可以发一下吗?
  • C 规范说 tm_years 是“自 1900 年以来的年数”。为什么不坚持标准并避免这整个混乱?

标签: c++ datetime time


【解决方案1】:

根据定义,struct tmtm_year 字段是自 1900 年以来的年数。处理struct tm 的每段代码都希望是这种情况。您不能将 tm_year 设置为 2010 年并期望代码能够神奇地确定您的真正意思是 2010 年而不是 3910 年。

tm_year 设置为110,strftime 将起作用。

【讨论】:

    【解决方案2】:

    当您在currentstruct 中输入年份时,您显然输入了2010,但您需要输入2010-1900

    如果您从系统中检索时间并转换为带有localtime 之类的struct tm,则不需要做任何减法,因为它放入struct tm 中的已经是年份了 - 1900。“手动”填写年份时,确实需要减去 1900。

    【讨论】:

    • 啊,我现在明白了,我是手动填充 tm* 结构,但我已经习惯了系统为我填充 tm* 结构。这是有道理的,现在我将在手动填充结构时输入 110,我会得到正确的日期,干杯 Jerry
    【解决方案3】:

    看起来currentstruct-&gt;tm_year2010,这确实表示一年中的日期3910。为了使它正确,所以它表示 this 年的日期,你必须做一个

    currentstruct->tm_year -= 1900;
    

    没有办法告诉strftime(或其他系统函数)您的struct tm 不是真正的struct tm,因为它遵循不同于系统强加的约定(例如,您希望从 0 开始而不是比从 1900 年开始)。

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多