kernel32.GetDateFormatEx 和 ar-SA 日期

kernel32.GetDateFormatEx and ar-SA dates

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

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

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

它 return 的值是 "06/01/37",这不是我所期望的。我希望使用 ar-SA 语言(即,在我的英语眼中,看起来像口号)。

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

所以,重申一下,我想知道的是:

  1. 我如何获取阿拉伯语日期,更像是:تشرين الأول أكتوبر ١٩ ١٥

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

是否有可能是您自己在测试 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:

Note: If you got the Gregorian date with Arabic names, then you probably forgot to set the calendar type to the Hijri calendar.

因此您的 Windows 似乎必须在您的区域设置中选择回历才能使用传统数字对数字进行格式化。

更新 5

Finally, how do I detect that the Hijri calendar is being used in that case?

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

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