OSX无法将ISO8601转换为epoch时间戳

3

我正在适应Mac OS系统,但是我发现一些脚本在从Linux迁移到Mac OS后无法正常工作。其中一个特别有趣的脚本。

因此,我试图将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 Yosemite 10.10.4

更新: 额外的细节-我建议这是一个date实用程序之间的差异,除了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
1个回答

3
简短的回答是,当您使用这些参数运行macOS/BSD的date实用程序时,您得到的输出是预期和正确的输出。这与GNU date不同。
如果您想从GNU date获得类似的输出,则需要添加--utc选项,并像这样运行:
echo $(date --utc -d '2015-09-09T13:19:09Z' +"%a %-d %b %Y %H:%M:%S") $(date +%Z)

如果您的时区设置为 NZST,那么上面的代码会输出以下内容:
Wed 9 Sep 2015 13:19:09 NZST

那个调用就像你想象中的BSD date在运行date -j -f "%FT%TZ" "2015-09-09T13:19:09Z"时所做的一样。一方面,尽管你说要将这个日期/时间放入默认格式(并且不改变它),但它还是会抛出一个时区。
另一种思考它在做什么的方式是:默认情况下,BSD date 的操作就像你给出了等效于--utc选项,基本上是GNU date默认值的相反。
换句话说,BSD date -j -f的一个重要区别在于它实际上只意味着:拿这个字符串在这个其他日期格式中,然后将其放入我们在此处使用的默认日期格式中——完全不考虑本地时区

在Linux上使用相同的工具可以得到正确的答案...

macOS/BSD date和GNU/Linux date不是相同的工具。它们只是有相同的名称。
关于在脚本中使date在各个平台上表现相同,你可以通过使用Homebrew安装coreutils软件包来获取GNU date
brew install coreutils

这将使GNU版本在您的OS X系统下以名称的形式可用。因此,您可以在脚本中将 date 替换为 $ DATECMD (或其他内容),然后:
  • 在您的OS X环境中, set DATECMD = gdate
  • 在您的Linux环境中, set DATECMD = date
当然,您也可以只执行 alias date = gdate ,但不建议这样做,因为您可能有时想运行期望在您的环境中使用BSD date 的第三方工具。

1
更新了帖子。那是我的第一个猜测,只是date实用程序不同,但事实证明,我尝试了不同的实用程序,它们在OSX上都给出了相同的结果。它是深藏在某个库中还是什么? - flashvoid
关于Python,请参考http://stackoverflow.com/questions/24732872/dateutil-parser-parse-and-lost-timezone-information和https://dev59.com/TEzSa4cB1Zd3GeqPkjZL。关于底层库,请查看'man strptime'。您可以尝试编写自己的简单C应用程序,使用'strptime(3)',然后看看在OS X和Linux系统上是否有不同的行为。 - sideshowbarker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接