2015-09-11 54 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

相关问题