2010-08-09 105 views
3

我有一個日期時間對象,我希望根據OS語言環境設置創建日期字符串(例如,在Windows'7區域和語言設置中指定)。Python:使用%x(語言環境)格式化的日期與預期不符

以下Python的datetime formatting documentation,我用這應該輸出「語言環境的適當的日期表示。」的%x格式代碼。我期望這個「表示」是Windows「短日期」或「長日期」格式,但它不是一個。 (我已經短日期格式設置爲d/MM/yyyy和長日期格式dddd d MMMM yyyy,但輸出dd/MM/yy

什麼是錯在這裏:Python文檔,Python實現,還是我的期望呢? (以及如何解決?)

回答

7

閱讀setlocale() documentation後,我理解的是默認的操作系統區域設置不使用Python作爲默認語言環境。要使用它,我不得不開始我的模塊有:

import locale 
locale.setlocale(locale.LC_ALL, '') 

或者,如果你打算只重置區域的時間設置,因爲它打破少很多事情只使用LC_TIME

import locale 
locale.setlocale(locale.LC_TIME, '') 

肯定這會有一個合理的理由,但至少可以在Python文檔中爲%x指令提到這一點。

+0

來自https://wiki.debian.org/Locale:「強烈建議不要使用LC_ALL,因爲它會覆蓋所有內容,請僅在測試時使用,並且不要將其設置爲啓動文件。」 – dstonek 2018-03-07 18:49:20

5

您的語言環境是否在您的腳本中設置?如果您致電locale.getlocale(),結果是否是預期的?以下比較:

>>> import locale 
>>> locale.getlocale() 
(None, None) 
>>> import datetime 
>>> today = datetime.date.today() 
>>> today 
datetime.date(2010, 8, 9) 
>>> today.strftime('%x') 
'08/09/10' 
>>> locale.setlocale(locale.LC_ALL, "de_DE.UTF-8") 
'de_DE.UTF-8' 
>>> locale.getlocale() 
('de_DE', 'UTF8') 
>>> today.strftime('%x') 
'09.08.2010' 

需要注意的是有缺陷的datetime模塊中,因爲在底層的C庫錯誤的居多。例如,在我的安裝(最新的OS X)上,格式化字符串%z完全不可用。

在Windows上,可用於setlocale()的語言環境字符串的語法遵循與* nix平臺上不同的語法。列表是here on MSDN

如果您只是希望將您的腳本設置爲用戶安裝的任何默認語言環境(在我的英國英語中),則只需在主腳本的開頭執行此操作即可。不這樣做的模塊,因爲它覆蓋了一個全局變量:

>>> locale.setlocale(locale.LC_ALL, "") 
'en_GB.UTF-8' 
相關問題