Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从unix命令行将毫秒时间戳转换为日期_Unix_Date_Awk - Fatal编程技术网

从unix命令行将毫秒时间戳转换为日期

从unix命令行将毫秒时间戳转换为日期,unix,date,awk,Unix,Date,Awk,我知道 date -d @<timestamp in seconds> date-d@ 及 awk'{print strftime(“%c”,)} 但是如果我有毫秒呢。在不删除毫秒时间戳的最后三个字符的情况下,有没有一种简单的方法可以做到这一点(虽然删除字符并不困难,但我认为对于这样一个简单的任务,有一种一步的方法)?perl-e'print scalar localtime(/1000)“ 您可以除以1000,而不是删除字符: awk '{print strftime(&qu

我知道

date -d @<timestamp in seconds>
date-d@

awk'{print strftime(“%c”,)}
但是如果我有毫秒呢。在不删除毫秒时间戳的最后三个字符的情况下,有没有一种简单的方法可以做到这一点(虽然删除字符并不困难,但我认为对于这样一个简单的任务,有一种一步的方法)?

perl-e'print scalar localtime(/1000)“

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

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

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

我在Mac上的bash配置文件中的内容:

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

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

扩展Greg的perl方法,我使用此perl脚本自动扫描历元时间戳并转换为ISO8061

此脚本同时处理秒和毫秒


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

这对我在bash中非常有用,并且比上面接受的答案简单一些:

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

ms_date=1603884641215;日期-d@$((ms_日期+500)/1000))
解释:

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

  • 在看到科学记数法中除法的输出后,没有意识到awk解决方案会起作用。
    date
    命令根本不起作用。正确的答案应该是
    date-d@$(echo)(毫秒时间戳+500)/1000“| bc)
    。你们能告诉我这样做有什么不好:
    echo$(${毫秒时间戳}/1000))
    ?除以1000将舍入错误。在shell中,地板整数将是答案
    3800/1000
    将是
    3
    ,而不是
    4
    。因此它只是一个非常基本的
    ceil()
    函数?对于查看具有时间戳的csv数据非常有用:
    cat mydata.csv | perl-pe's{(\d{13}}}{print scalar localtime($1/1000)}ge'gnucoreutils-date,8.26
    )中的
    -r
    选项是
    -r、-reference=FILE。。。显示文件的上次修改时间
    。我使用了你的bash算法,得到了我需要的结果。你为什么加500?这与bash数学插值的工作原理有关吗?我只是从上面复制了该算法,并将其转换为bash语法,但在任何给定的情况下,除以1000都会向上取整,而不是向下取整。
    date -d @$(  echo "(MilliSecondTimeStamp + 500) / 1000" | bc)
    
    gdate -d @$(  echo "(MilliSecondTimeStamp + 500) / 1000" | bc)
    
    day() {
      date -r $(($1 / 1000))
    }
    
    date -r $(( (<timestamp in milliseconds> + 500) / 1000 ))