我开始使用 mac os,但我的一些脚本在 linux 之后无法运行。有一个脚本特别有趣。
所以我正在尝试将 ISO8601 日期转换为 unix 纪元。 OSX 的 native 方式似乎是
$ 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
更新:
只是一些额外的细节 - 我建议它是 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
最佳答案
简短的回答是,当您使用这些参数运行 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
当以 date -j -f "%FT%TZ""2015-09-09T13:19:09Z"运行时,您可以想象 BSD
。一方面,即使您说的是将此日期/时间设置为默认格式(并且不要更改它),它也会在那里扔一个时区。date
执行的调用
另一种思考它在做什么的方法是:默认情况下,BSD date
的运行就好像你给了一个等价的 --utc
选项——也就是说,本质上与 GNU date
默认值相反。
换句话说,与 BSD date -j -f
的一个重要区别是它实际上只是意味着:将此字符串采用其他日期格式并将其放入默认日期我们在这里使用的格式——根本不考虑本地时区。
same tools on linux giving correct answer ...
macOS/BSD date
和 GNU/Linux date
不是同一种工具。它们只是具有相同的名称。
就让脚本中的 date
跨平台行为相同而言,您可以通过使用自制软件安装 coreutils
来获取 GNU date
> 包裹:
brew install coreutils
这将使 GNU 版本在您的 OS X 系统上可用,名称为 gdate
。因此,您可以将脚本中的 date
替换为 $DATECMD
(或其他内容),然后:
- 在您的 OS X 环境中,
设置 DATECMD=gdate
- 在您的 Linux 环境中,
设置 DATECMD=date
当然,您也可以只执行 alias date=gdate
但不推荐,因为有时您可能希望运行需要 BSD 的第 3 方工具 日期
在你的环境中。
关于macos - OSX 无法将 ISO8601 转换为纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518831/