2017-06-23 28 views
1

請參閱下面的代碼,我必須更改我的區域設置才能夠轉換日期。我的第一次嘗試不成功,我的第二次嘗試工作,雖然它似乎是多餘的,並沒有改變Sys.getlocale的輸出。Sys.setlocale意外的行爲

我的操作系統是Windows 7 64位

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252" 
date <- "Dec-11" 
as.Date(date, format = "%b-%d")  # NA 
Sys.setlocale(locale = "UK")  # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" 
locale2 <- Sys.getlocale() 
as.Date(date, format = "%b-%d")  # NA 
Sys.setlocale("LC_TIME", "English_United Kingdom") 
locale3 <- Sys.getlocale()   # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" 
as.Date(date, format = "%b-%d")  # "2017-12-11" 
locale2 == locale3     # TRUE 

我可以跳過第一次調用Sys.getlocale和日期轉換將工作:

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252" 
date <- "Dec-11" 
as.Date(date, format = "%b-%d")  # NA 
Sys.setlocale("LC_TIME", "English_United Kingdom") # 
locale4 <- Sys.getlocale()   # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" 
as.Date(date, format = "%b-%d")  # "2017-12-11" 

但是,這並不工作:

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252" 
date <- "Dec-11" 
as.Date(date, format = "%b-%d")  # NA 
Sys.setlocale(locale = "English_United Kingdom") # 
locale5 <- Sys.getlocale()   # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" 
as.Date(date, format = "%b-%d")  # NA 

這與此問題有關:Converting integer format date to double format of date

+0

加入您的操作系統信息,它太,這是在有關區域設置和日期格式的所有問題的關鍵。此外,如果您執行'Sys.setlocale(locale =「English_United Kingdom」)'而不是'Sys.setlocale(locale =「UK」),會發生什麼? –

+0

請參閱更新的答案 –

+1

我也做了一些更多的測試,除非我錯過了一些東西,這看起來像一個錯誤。唯一要弄清楚的是該錯誤實際存在的地方。它可能是R,但這也可能是Windows。我會在今晚進一步檢查另一個系統,並保持更新。我也發佈在R-devel上,希望有些R大師可以在此發光:http://r.789695.n4.nabble.com/LC-TIME-not-set-correctly-by- Sys-setlocale-td4740135.html –

回答

0

按照answer of prof. dr. Brian Ripley

這是Windows中的預期行爲。在其他系統上,格式化strptime()的基本功能使用操作系統特定的strptime函數,但Windows沒有。所以R在非英文日或月份名稱的情況下使用替代函數。由於您的法語區域設置爲標準語言,因此您的R設置爲識別法語的日/月名稱/縮寫。

strptime的替代函數使用它自己的那些日期和月份名稱的映射,但只有在專門設置了"LC_TIME"時纔會刷新此映射。至少對於使用相同機制的R 3.4.0和更早版本來說,情況就是這樣。

因此違背了我的第一印象,這是不是一個錯誤,但功能:-)

+1

一個功能,使得Sys.getlocale返回不準確的信息LC_TIME雖然 –

+0

@Moody_Mudskipper其實不是。 「特徵」是'strptime()'沒有正確檢測到LC_TIME的變化。 –