我正在使用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日历?
所以,要重新迭代,我想知道的是:
我如何获得阿拉伯语约会,更像是:تشرينالأولأكتوبر19 15
如何检测用户期望使用的日历类型?
答案 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_LONGDATE
,DATE_AUTOLAYOUT | DATE_USE_ALT_CALENDAR | DATE_LONGDATE
,DATE_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