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

iqih9akk  于 2023-05-17  发布在  Unix
关注(0)|答案(8)|浏览(261)

我知道

date -d @<timestamp in seconds>

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

但如果我只有毫秒呢有没有简单的方法来做到这一点,而不删除毫秒时间戳的最后三个字符(并不是说删除字符很困难,但我认为有一个简单的任务一步到位的方法)?

dffbzjpn

dffbzjpn1#

除了删除字符,您可以除以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:Thx zeekvfu,fixed.

tcbh2hod

tcbh2hod2#

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

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

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

bvuwiixz

bvuwiixz3#

perl -e 'print scalar localtime(<timestamp> / 1000)'
hwamh0ep

hwamh0ep4#

在BASH中

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

解释:

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

fzsnzjdm5#

这在bash中对我来说很有用,它比上面的公认答案简单一点:

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

iszxjhcz6#

在Greg的perl方法的基础上进行扩展,我使用这个Perl脚本https://github.com/moose1089/epoch2iso自动扫描epoch时间戳并转换为ISO8061。
此脚本处理秒和毫秒。
因为它转换它找到的任何数字,所以您不必提取具有时间戳的特定字段,但相反,它也可能转换不打算作为时间的数字。

biswetbf

biswetbf7#

不需要损失任何精度:

ts=1684254777119
echo $(date -d @${ts:0:10} --utc --iso=s | cut -d '+' -f 1).${ts:10}+00:00

输出:

2023-05-16T16:32:57.119+00:00

也具有更高的精度:

ts=1684254777119581
echo $(date -d @${ts:0:10} --utc --iso=s | cut -d '+' -f 1).${ts:10}+00:00

输出:

2023-05-16T16:32:57.119581+00:00
wlzqhblo

wlzqhblo8#

你不需要使用date来保持精度:

echo 1684254777119 |
mawk '{ print strftime("%c ( %s."  substr( $1, 
                length($1) - 2) " )", int( $1 / 1000 ) ) }'
Tue May 16 12:32:57 2023 ( 1684254777.119 )

如果你的输入有这样的精度,你甚至可以达到纳秒级:

echo 5994354333719137839 |
gawk '{ print strftime("%c ( %s."  substr( $1, 
                length($1) - 8) " )", int( $1 / 10^9)) }'
Fri Dec 14 21:25:33 2159 ( 5994354333.719137839 )

相关问题