Winapi GetDateFormat()在1601年1月1日之前的日期失败

Winapi GetDateFormat()在1601年1月1日之前的日期失败,winapi,localization,internationalization,Winapi,Localization,Internationalization,我正在尝试使用Windows函数格式化日期: 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 nul

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

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,它可以返回以下错误代码之一:

  • 错误\u缓冲区不足。提供的缓冲区大小不够大,或者未正确设置为NULL
  • 错误\u无效\u标志。为标志提供的值无效
  • 错误\u无效\u参数。任何参数值都无效
但是,如果我在一天后返回日期:

SYSTEMTIME dt;
dt.wYear = 1601;
dt.wMonth = 1;
dt.wDay = 1;
然后它就起作用了

我做错了什么?如何设置日期格式

e、 g.以下日期:

或:

或者凯撒去世的日期:

-3/15/44

额外阅读
  • 将其全部整理出来
结构仅在1601年到30827年期间有效,因为在Windows机器中,系统时间是从1.1.1601 00:00开始从经过的时间间隔开始计算的。看见
文章。

这实际上是一个限制

…自1601年1月1日起的年/月/日/小时/分钟/秒/毫秒值00:00:00 UT。。。至12月31日30827 23:59:59.999


我花了一些时间研究如何绕过这个限制,但由于
GetDateFormat()
需要
SystemTime
时间,您可能必须咬紧牙关,编写自己的
format()
方法。

严格来说,您指的是结构,这是自1601年1月1日起的
100 ns
间隔数。另一方面,我现在确实看到了
时间戳
的最小值和最大值。现在我明白了,这是
时间戳
的限制(而不是使用公历的
GetDateFormat
),我别无选择,只能到别处看看。我希望Windows中的其他地方有一个函数可以在特定区域设置日期格式。哎呀,你说的
FILETIME
100ns
的计数是对的。读它的时候我的眼睛一定有点跳。当然,这个想法仍然成立,只是
SYSTEMTIME
显示为年/月/日/小时/分/秒/毫秒值,而不是零年。耶稣名义上出生于0001年12月25日。1867年阿拉斯加没有十月七日。(当年也没有10月8日、9日、10日、11日、12日、13日、14日、15日、16日或17日)
-10/22/4004 6:00 PM
-3/15/44