macos - OSX 无法将 ISO8601 转换为纪元

标签 macos epoch iso8601 bsd darwin

我开始使用 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"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/

相关文章:

c++ - Mac OSX 主函数中未初始化的指针

sql - Bigquery iso8601 字符串转时间戳

c - ISO 8601 周数(C 语言)

azure - Azure 服务总线队列的 "Default message time to live"的值是多少?

python - 在 Pyspark 中将纪元时间转换为时间戳

node.js - 使用 thrift 时 Node.js 中的纪元日期不正确

python - 非法指令: 4 when importing python pandas

objective-c - OS X(Cocoa 等)创建可取消周期性操作的惯用方法

macos - OS X 不支持 epoll 功能吗?

python - 如何将超出范围的纪元转换为日期时间python?