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 一个阿拉伯语短日期字符串,特别是公历,但它似乎使用的是回历。如何检测正在使用回历?
所以,重申一下,我想知道的是:
我如何获取阿拉伯语日期,更像是:تشرين الأول أكتوبر ١٩ ١٥
如何检测用户期望使用的日历类型?
是否有可能是您自己在测试 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:
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
我正在使用 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 一个阿拉伯语短日期字符串,特别是公历,但它似乎使用的是回历。如何检测正在使用回历?
所以,重申一下,我想知道的是:
我如何获取阿拉伯语日期,更像是:تشرين الأول أكتوبر ١٩ ١٥
如何检测用户期望使用的日历类型?
是否有可能是您自己在测试 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:
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