【问题标题】:How to convert date string to epoch timestamp with the OS X BSD `date` command?如何使用 OS X BSD `date` 命令将日期字符串转换为纪元时间戳?
【发布时间】:2022-04-15 11:45:19
【问题描述】:

我有一个格式为 Jul 27 23:59:59 2016 GMT 的日期字符串,我需要使用 OS X BSD date 命令将其转换为等效的纪元时间戳。

GNU date 有一个很好的 -d/--date=STRING 参数:

$ date -d "Jul 27 23:59:59 2016 GMT" +'%s'
1469663999

遗憾的是,OSX 上的 BSD date 命令没有这样的选项。

date -j -f "<FORMAT>" "Jul 27 23:59:59 2016 GMT" +'%s' 似乎是要走的路,但我找不到写入格式字符串。 Apple's man page 状态:

date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

can be used to parse the output from date and express it in Epoch time.

但这似乎不是真的:

$ date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
Failed conversion of ``Wed 13 Jul 2016 11:17:49 BST'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

如何使用 OS X BSD date 命令将这种格式的日期字符串转换为纪元时间戳?


我似乎无法从 date 获得版本,但如果这很重要的话,我在 OS X 10.11.5 (El Capitan) 上。

【问题讨论】:

    标签: macos date


    【解决方案1】:

    你是这个意思吗?

    date -j -f "%a %b %d %T %Z %Y" "Wed Jul 13 11:30:27 BST 2016" +"%s"
    1468405827
    

    我通过告诉date 以与您使用的格式相同的格式输出来解决这个问题:

    date -j +"%a %b %d %T %Z %Y"
    

    【讨论】:

    • 我发现在调用date命令的时候需要加上-u选项才能转换成UTC,否则会使用我本地机器的时区,把时间戳扔掉。
    【解决方案2】:

    您的date 命令正在以以下格式输出日期:

    Wed 13 Jul 2016 11:17:49 BST (Format sequence is: "%a %d %b %Y %T %Z")
    

    并且您正在尝试使用表达式对其进行解析以匹配以下格式:

    Wed Jul 13 11:17:49 BST 2016 (Format sequence is: "%a %b %d %T %Z %Y")
    

    导致:

    ``2016 年 7 月 13 日星期三 11:17:49 BST'' 转换失败,使用格式 ``%a %b %d %T %Z %Y''强>

    因此,基本上,您需要使用以下命令更改格式序列:

    $ date -j -f "%a %d %b %Y %T %Z" "`date`" +"%s"
    

    为了匹配您的date 命令默认输出的Wed 13 Jul 2016 11:17:49 BST 格式。

    要使用基于相同格式的自定义日期:

     $ date -j -f "%a %d %b %Y %T %Z" "Wed 13 Jul 2016 11:17:49 BST" +"%s"
    

    关于格式字符串序列的 [some of] 含义的一些参考资料:

    • %a 区域设置的工作日缩写名称(例如,Sun)
    • %d 天(例如 01)
    • %b 语言环境的月份缩写名称(例如 Jan)
    • %Y
    • %T 次;与 %H:%M:%S 相同
    • %Z 字母时区缩写(例如 EDT)

    【讨论】:

    • 感谢您的帮助。该格式确实来自 Apple 的手册页,因此我认为文档已过时。您知道该格式的全部日期符号是否记录在任何地方?
    • Mark Setchell 是第一个给出正确答案的人,所以我要给他打勾,但我对此表示赞同。感谢您的完整回复。
    • 当然。顺便说一句,关于格式的完整文档,您可以 man strftime 或者,如果不可用,请参阅 man7.org/linux/man-pages/man3/strftime.3.html
    【解决方案3】:

    我在尝试将类似的 datetime 转换为 epoch 时遇到了问题。我想我也会把它放在这里以用于这种格式。 date -j -f "%Y-%m-%d %H:%M:%S" "2018-01-30 15:58:50" "+%s" 1517349530

    【讨论】:

      【解决方案4】:

      这是另一种方式:

      $ python -c 'import time
      > print int(time.time())'
      1468406482
      

      【讨论】:

      • 不是我的反对票,但这会转换 当前 日期,而不是任意日期。如果您需要 Linux 和 MacOS 之间的可移植性(以 Python 2 与 Python 3 的复杂性为模),实际上使用 Python 并不是一个坏主意。
      猜你喜欢
      • 2017-11-10
      • 2012-04-03
      • 2018-02-18
      • 2018-01-27
      • 2015-08-08
      • 2012-11-22
      • 2014-11-18
      • 2022-08-04
      • 2021-05-09
      相关资源
      最近更新 更多