【问题标题】:Convert milliseconds timestamp to date from unix command line从 unix 命令行将毫秒时间戳转换为日期
【发布时间】:2023-03-11 18:01:01
【问题描述】:

我知道

date -d @<timestamp in seconds>

awk '{print strftime("%c", <timestamp in seconds>)}'

但是如果我有几毫秒呢?是否有简单的方法可以在不删除毫秒时间戳的最后三个字符的情况下做到这一点(并不是说删除字符很困难,但我认为对于这样一个简单的任务会有一个一步一步的方法)?

【问题讨论】:

    标签: unix date awk


    【解决方案1】:
    perl -e 'print scalar localtime(<timestamp> / 1000)'
    

    【讨论】:

    • 对于查看带有时间戳的 csv 数据非常有用:cat mydata.csv | perl -pe 's{(\d{13})}{print scalar localtime($1/1000)}ge'
    • 其实我发现“打印”这个词搞乱了字段的顺序。只需删除 print 关键字,即cat mydata.csv | perl -pe 's{(\d{13})}{scalar localtime($1/1000)}ge'
    【解决方案2】:

    您可以除以 1000,而不是删除字符:

    awk '{print strftime("%c", ( <timestamp in milliseconds> + 500 ) / 1000 )}'
    

    或者:

    date -d @$(  echo "(MilliSecondTimeStamp + 500) / 1000" | bc)
    

    或(MacOS):

    gdate -d @$(  echo "(MilliSecondTimeStamp + 500) / 1000" | bc)
    

    编辑:根据商而不是除法进行调整。 Edit2:谢谢 zeekvfu,已修复。

    【讨论】:

    • 在看到科学计数法的除法输出后,没有意识到 awk 解决方案会起作用。
    • date 命令根本不起作用。正确答案应该是date -d @$(echo "(millisecond_timestamp+500)/1000" | bc)
    • 你们能告诉我这样做有什么不好吗:echo $(( ${MilliSecondTimeStamp} / 1000 ))
    • 除以 1000 会舍入错误。在 shell 中,下限整数就是答案。 3800 / 1000 将是 3,而不是 4
    • 所以它只是一个非常基本的ceil()函数?
    【解决方案3】:

    我在 Mac 上的 bash 个人资料中有什么:

    day() {
      date -r $(($1 / 1000))
    }
    

    day 1486743904359 返回Fri Feb 10 08:25:04 PST 2017

    【讨论】:

    • 在我的日期副本 (GNU coreutils date, 8.26) 中,-r 选项是 -r, --reference=FILE ... display the last modification time of FILE。我将你的 bash 算法与 Kugelman's date invocation 一起使用,得到了我需要的结果。
    【解决方案4】:

    扩展 Greg 的 perl 方法,我使用这个 Perl 脚本 https://github.com/moose1089/epoch2iso 自动扫描纪元时间戳并转换为 ISO8061。

    此脚本同时处理秒和毫秒。

    当它转换它找到的任何数字时,您不必提取带有时间戳的特定字段,但相反它也可能转换不打算作为时间的数字。

    【讨论】:

      【解决方案5】:

      这在 bash 中对我很有用,而且比上面接受的答案要简单一些:

      date -r $(( (<timestamp in milliseconds> + 500) / 1000 ))
      

      【讨论】:

      • 为什么要加500?它与 bash 数学插值的工作原理有关吗?
      • 我刚刚从上面复制了该算法并将其转换为 bash 语法,但在任何给定的情况下,大概是为了除以 1000 将向上取整而不是向下取整。
      【解决方案6】:

      在 BASH 中

      ms_date=1603884641215; date -d @$(((ms_date + 500)/1000))
      

      解释:

      1. date -d @number-of-seconds 接收秒数(自纪元)并返回格式化日期
      2. $(()) 表示 bash 中的数学插值,例如echo $((1 + 2))
      3. 将毫秒除以 1000 以获得所需的秒数测量值
      4. 添加 500 是为了毫秒舍入到最接近的秒数

      【讨论】:

        猜你喜欢
        • 2014-04-17
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 2020-06-24
        • 2016-04-22
        • 1970-01-01
        相关资源
        最近更新 更多