2015-10-19 55 views
1

我(使用Python更具體地說,ctypes.windll.kernel32.GetDateFormatEx),這是在kernel32.GetDateFormatEx和AR-SA日期

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

記錄使用GetDateFormatEx而使用今天的日期爲SYSTEMTIME輸入和NULL格式字符串和0標誌。但是專門用於ar-SA語言環境。

它返回的值爲"06/01/37",這不是我所期望的。我預計在ar-SA語言(即,在我的英文眼裏,看起來像是小嘴巴)。

我也希望它會返回一個阿拉伯語的短日期字符串,具體而言,對於公曆,但它似乎是使用回曆代替。我如何檢測到Hijri日曆正在被使用?

因此,再次重申,我想知道的是:

  1. 如何獲得阿拉伯語日期,更多的東西一樣:تشرينالأولأكتوبر19 15

  2. 我如何檢測用戶期望使用的日曆的類型?

回答

1

是否有可能您自己已覆蓋測試PC上日期格式的區域設置?也許你需要使用LOCALE_NOUSEROVERRIDE標誌。

UPDATE

我已經在這個測試C++

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

所得日期是

06 /محرم/ 1437

UPDATE 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"格式更squigly:

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

UPDATE 4

進一步搜索發現this

注:如果你得到了公曆日期與阿拉伯名字,那麼你可能忘了設置日曆類型的回曆。

因此,您的Windows似乎必須在您的區域設置中選擇Hijri日曆,才能使用傳統數字格式化數字。

UPDATE 5

最後,我怎麼檢測到回曆是在這種情況下被使用?

您可以檢測正在使用通過調用GetLocaleInfoEx()LOCALE_ICALENDARTYPELCType參數和返回的數字與WinNls.h定義的常量比較日曆:

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

但是,我仍然看到識別號碼出現。如果你看看win32時鐘,你將看不到這些。我也實際上_want_用戶指定的日期,我正在測試我的開發機器上的日期格式設置,我想得到一個類似的輸出作爲時鐘。最後,我如何檢測Hijri日曆在這種情況下被使用? – Arafangion

+0

@Arafangion:既然您剛開始提到Python,那麼使用與操作系統無關的區域設置提供程序(如PyICU)怎麼樣?這是一個至少值得考慮的選擇。 – wilx

+0

我已經使用unicode,並且有很好的unicode支持,但是我可以發誓ICU只提供unicode編碼服務 - 我不知道它還提供日期處理和(顯然)日曆服務 - 感謝您檢查它。 – Arafangion