1

我正在尝试使用 Windows GetDateFormat API函数格式化日期:

nResult = GetDateFormat(
      localeId,   //0x409 for en-US, or LOCALE_USER_DEFAULT if you're not testing
      0,          //flags
      dt,         //a SYSTEMTIME structure
      "M/d/yyyy", //the format we require
      null,       //the output buffer to contain string (null for now while we get the length)
      0);         //the length of the output buffer (zero while we get the length)

现在我们传递一个日期/时间:

SYSTEMTIME dt;
dt.wYear = 1600;
dt.wMonth = 12;
dt.wDay = 31;

在这种情况下 nResult 返回零:

如果不成功,该函数返回 0。要获取扩展错误信息,应用程序可以调用 GetLastError,它可以返回以下错误代码之一:

  • ERROR_INSUFFICIENT_BUFFER。提供的缓冲区大小不够大,或者它被错误地设置为 NULL。
  • ERROR_INVALID_FLAGS。为标志提供的值无效。
  • ERROR_INVALID_PARAMETER。任何参数值无效。

但是,如果我在一天后返回一个日期:

SYSTEMTIME dt;
dt.wYear = 1601;
dt.wMonth = 1;
dt.wDay = 1;

然后它工作。

我究竟做错了什么?我如何格式化日期?

例如基督诞生的日期:

12/25/0000

宇宙开始的日期

-10/22/4004 6:00 PM

或凯撒去世的日期:

-3/15/44

奖金阅读

4

2 回答 2

2

这实际上是对SystemTime的限制。

...year/month/day/hour/minute/second/milliseconds value since 1 January 1601 00:00:00 UT... to 31 December 30827 23:59:59.999

我花了一些时间寻找如何绕过这个限制,但是因为GetDateFormat()需要一个SystemTime你可能不得不硬着头皮写你自己的format()方法。

于 2012-09-11T19:31:13.987 回答
1

SYSTEMTIME结构仅从 1601 年到 30827 年有效,因为在 Windows 机器中,系统时间是从 1.1.1601 00:00 开始的经过时间间隔计算的。参见 维基百科文章。

于 2012-09-11T19:25:57.270 回答