【问题标题】:"date -d" doesn't accept ISO 8601 format"date -d" 不接受 ISO 8601 格式
【发布时间】:2014-02-03 00:31:15
【问题描述】:

我做错了吗?当我使用带有秒数的ISO 8601 选项时,我不敢相信date -d 不接受自己的输出。我必须删除“T”或时区才能使其正常工作。

> 日期-Iseconds 2014-01-14T11:07:57-0800 > 日期-d“2014-01-14T11:07:57-0800” 日期:无效日期“2014-01-14T11:07:57-0800” > date -d "2014-01-14 11:07:57-0800" # 去掉 'T' 2014 年 1 月 14 日星期二 11:07:57 PST > date -d "2014-01-14T11:07:57" # 删除时区 2014 年 1 月 13 日星期一 20:07:57 PST

我目前的解决方案是使用date +"%Y-%m-%d %T %z" 而不是date -Iseconds,但我只是觉得这很奇怪。

【问题讨论】:

  • 一个sed 命令可以删除T...为什么来回翻译?
  • 初始 date -d 格式适用于我的 bash GNU bash, version 4.1.10(4)-release (i686-pc-cygwin) 版本。 bash --version 对你的输出是什么?
  • bash 的版本应该是无关的;更好的问题是你们每个人都使用什么版本的date
  • 有关 ISO 8601 和 date 的旧版本的更多信息:unix.stackexchange.com/questions/107750/…
  • @abiessu 我正在将 ISO 8601 格式的开始和结束日期时间写入日志文件,然后还需要将它们转换为纪元秒以计算持续时间。但是你提出了一个很好的观点。我还可以将变量保留为默认日期格式,并且仅在写入日志时转换为 ISO 8601。这样只有 1-way 转换而不是 2-way。

标签: bash date


【解决方案1】:

也许您的语言环境干扰了日期解析?

尝试指定时间区域:

$ LC_TIME=C date -d "2014-01-14T11:07:57-0800"
Tue Jan 14 11:07:57 PST 2014

这对我来说适用于 GNU 日期 8.13。

【讨论】:

  • 这不适用于 8.4 版;我怀疑接受输入格式的能力是后来添加到date 的,而不是严格依赖于语言环境。
【解决方案2】:

自 8.13 版(2011-09-08 发布)以来,GNU coreutils 仅支持 ISO 8601 日期作为输入。

感谢@John1024 参考 https://unix.stackexchange.com/questions/107750/how-to-parse-iso8601-dates-with-linux-date-command

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2019-02-19
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多