【发布时间】:2023-03-11 18:01:01
【问题描述】:
我知道
date -d @<timestamp in seconds>
和
awk '{print strftime("%c", <timestamp in seconds>)}'
但是如果我有几毫秒呢?是否有简单的方法可以在不删除毫秒时间戳的最后三个字符的情况下做到这一点(并不是说删除字符很困难,但我认为对于这样一个简单的任务会有一个一步一步的方法)?
【问题讨论】:
我知道
date -d @<timestamp in seconds>
和
awk '{print strftime("%c", <timestamp in seconds>)}'
但是如果我有几毫秒呢?是否有简单的方法可以在不删除毫秒时间戳的最后三个字符的情况下做到这一点(并不是说删除字符很困难,但我认为对于这样一个简单的任务会有一个一步一步的方法)?
【问题讨论】:
perl -e 'print scalar localtime(<timestamp> / 1000)'
【讨论】:
cat mydata.csv | perl -pe 's{(\d{13})}{print scalar localtime($1/1000)}ge'
cat mydata.csv | perl -pe 's{(\d{13})}{scalar localtime($1/1000)}ge'
您可以除以 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,已修复。
【讨论】:
date 命令根本不起作用。正确答案应该是date -d @$(echo "(millisecond_timestamp+500)/1000" | bc)。
echo $(( ${MilliSecondTimeStamp} / 1000 )) ?
3800 / 1000 将是 3,而不是 4。
ceil()函数?
我在 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 一起使用,得到了我需要的结果。
扩展 Greg 的 perl 方法,我使用这个 Perl 脚本 https://github.com/moose1089/epoch2iso 自动扫描纪元时间戳并转换为 ISO8061。
此脚本同时处理秒和毫秒。
当它转换它找到的任何数字时,您不必提取带有时间戳的特定字段,但相反它也可能转换不打算作为时间的数字。
【讨论】:
这在 bash 中对我很有用,而且比上面接受的答案要简单一些:
date -r $(( (<timestamp in milliseconds> + 500) / 1000 ))
【讨论】:
在 BASH 中
ms_date=1603884641215; date -d @$(((ms_date + 500)/1000))
解释:
date -d @number-of-seconds 接收秒数(自纪元)并返回格式化日期$(()) 表示 bash 中的数学插值,例如echo $((1 + 2))
【讨论】: