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