kernel32.GetDateFormatEx和ar-SA日期

时间:2015-10-19 06:46:29

标签: windows date winapi calendar locale

我正在使用GetDateFormatEx(更具体地说,使用Python的ctypes.windll.kernel32.GetDateFormatEx),

https://msdn.microsoft.com/en-us/library/windows/desktop/dd318088%28v=vs.85%29.aspx

使用今天的日期作为SYSTEMTIME输入,以及NULL格式字符串和0标志。但是特别针对ar-SA语言环境。

它返回"06/01/37"的值,这不是我的预期。我希望使用ar-SA语言(即,在我的英语眼中,看起来像是笨蛋)。

我还预计它会返回一个阿拉伯语短日期字符串,特别是格里高利历,但它似乎使用的是Hijri日历。如何检测正在使用Hijri日历?

所以,要重新迭代,我想知道的是:

  1. 我如何获得阿拉伯语约会,更像是:تشرينالأولأكتوبر19 15

  2. 如何检测用户期望使用的日历类型?

1 个答案:

答案 0 :(得分:1)

您自己是否可以覆盖测试PC上日期格式的区域设置?也许你需要使用LOCALE_NOUSEROVERRIDE标志。

<强>更新

我在C ++中测试了这个

GetDateFormatEx(L"ar-SA", LOCALE_NOUSEROVERRIDE | DATE_AUTOLAYOUT | DATE_LONGDATE, nullptr, nullptr, buf, _countof(buf), nullptr);

结果日期为

  

06 /محرم/ 1437

更新2

这显然取决于Windows如何定义语言环境。我尝试了不同的旗帜组合(DATE_AUTOLAYOUT | DATE_LONGDATEDATE_AUTOLAYOUT | DATE_USE_ALT_CALENDAR | DATE_LONGDATEDATE_AUTOLAYOUT | DATE_USE_ALT_CALENDAR)。而对于"ar-SA",这给出了

  

06 /محرم/ 1437

     

06/01/1437

     

06/01/37

表示"ja-JP"(日语)

  

2015年10月19日

     

平成27年10月19日

     

平成27/10/19

我怀疑(不知道完整的Windows NLS功能),您将不得不使用特定的格式化字符串或其他库(如ICU)来获得更多的日期。

更新3

它可能不会比使用DATE_AUTOLAYOUT | DATE_USE_ALT_CALENDAR标志和L"dddd, dd MMMM, yyyy gg"格式更加紧张:

  

الإثنين,06محرم,1437بعدالهجرة

更新4

进一步搜索显示this

  

注意:如果您使用阿拉伯名字获得公历日期,那么您可能忘记将日历类型设置为Hijri日历。

因此,您的Windows似乎必须在您的语言环境中选择Hijri日历才能使用传统数字格式化数字。

更新5

  

最后,如何在这种情况下检测到Hijri日历的使用?

您可以使用LOCALE_ICALENDARTYPE作为LCType参数调用GetLocaleInfoEx()并将返回的数字与WinNls.h中定义的常量进行比较来检测正在使用的日历:

#define CAL_HIJRI                      6      // Hijri (Arabic Lunar) calendar
#define CAL_UMALQURA                   23     // UmAlQura Hijri (Arabic Lunar) calendar