2015-09-11 87 views
2

我在mac os上得到解決,而且我的一些腳本在linux之後無法運行。特別是一個腳本非常有趣。OSX無法將ISO8601轉換爲紀元

所以我試圖將ISO8601日期轉換爲unix時代。 做OSX原生的方式似乎是

$ date -j -f "%FT%TZ" "2015-09-09T13:19:09Z" 
Wed 9 Sep 2015 13:19:09 NZST 

$ date -j -f "%FT%TZ" "2015-09-09T13:19:09Z" +%s 
1441761549 

看起來不錯,除了它是錯誤的答案。它比真正的答案和我的時區+12小12個小時,所以雲時區如何影響unix時代?

而只是驗證自己

$ docker run -it --rm trusty date -d"2015-09-09T13:19:09Z" +%s 
1441804749 

相同的工具,在Linux上給予正確的答案...

我只是想了解什麼是錯在這裏 - 我缺少的東西或者是它只是一個破事兒?

OSX約塞米蒂10.10.4

UPD: 只是一些額外的細節 - 我建議它date UTIL之間的差異,但它不僅date

Stass-MacBook:~ void$ python -c 'import dateutil.parser; print dateutil.parser.parse("2015-09-09T13:19:09Z").strftime("%s")' 
1441761549 

Stass-MacBook:~ void$ docker run trusty python -c 'import dateutil.parser; print dateutil.parser.parse("2015-09-09T13:19:09Z").strftime("%s")' 
1441804749 

回答

0

簡短的回答是,你得到的輸出是預期和正確的輸出,當你運行OS X BSD date工具使用這些參數。因爲它不同於GNU date

對於來自GNU date類似這樣的輸出,你需要添加--utc選項,這樣運行這個程序:如果您的時區設置爲NZST

echo $(date --utc -d '2015-09-09T13:19:09Z' +"%a %-d %b %Y %H:%M:%S") $(date +%Z) 

,那麼上面會發出此:

Wed 9 Sep 2015 13:19:09 NZST 

概念,即調用是什麼時,爲date -j -f "%FT%TZ" "2015-09-09T13:19:09Z"運行,你可以想像BSD date做。一方面,即使你說的是,把這個日期/時間設置爲默認格式(而不是另外改變它),但它也在裏面拋出一個時區。

另一種方式想什麼它做的是,默認情況下BSD,如果你已經給了--utc選項,也就是說,本質上是在GNU date默認的相反的等效date運行。

換句話說,與BSD date -j -f一個重要的區別是,它真的只是意味着:藉此串在這個其他日期格式,只是把它放到我們這裏 - 使用不考慮本地時區的默認日期格式在所有的

事實上,BSD date在這種情況下以它的方式在本地時區上顯示,至少在我看來,這只是一種奇怪的,令人困惑的怪癖。

linux上的相同工具給出正確答案...

我希望從它上面更清楚OS X date和Linux date實際上並不相同的工具,而你,如果你希望他們有同樣的表現,你會感到失望......


至於讓你的腳本date有同樣的表現跨平臺,您可以通過使用自制安裝包coreutils得到GNU date

brew install coreutils 

這將使您的OS X系統上的GNU版本在名稱gdate下可用。所以,你可以接着用$DATECMD(或東西),然後替換date在腳本:

    在OS X環境
  • ,在Linux環境set DATECMD=gdate
  • set DATECMD=date

當然你可能只是做alias date=gdate,但這是不建議,因爲你有時可能想要在你的環境中運行期望BSD date的第三方工具。

+0

更新了帖子。這是我的第一個猜測,就是'date' util是不同的,但是當它發生時,我嘗試了不同的utils,並且它們都在OSX上給出了相同的結果。它在某個圖書館深處還是什麼? – flashvoid

+0

關於python,請參閱http://stackoverflow.com/questions/24732872/dateutil-parser-parse-and-lost-timezone-information和http://stackoverflow.com/questions/2335405/parse-timezone-abbreviation-to -utc關於底層庫,請參閱'man strptime'。您可以嘗試使用'strptime(3)'編寫自己的簡單C應用程序,並查看在OS X上與Linux系統上是否有不同的行爲。 – sideshowbarker

相關問題