Bash 在MacOs上是否有一种直接的方法来转换毫秒时间戳?

Bash 在MacOs上是否有一种直接的方法来转换毫秒时间戳?,bash,macos,shell,date,Bash,Macos,Shell,Date,将时间戳值(如158675709496转换为2020年4月13日星期一11:01:49.496 AM) 不幸的是,MacOs上的date工具预期的是秒,而不是毫秒,并且给出了错误的年份: > date -r 1586775709496 Thu Dec 2 15:24:56 CET 52252 这个现有的工具只解释了显而易见的一点:您可以除以1000(从后面的3位数字中切掉),内置的date工具就可以工作了 但是:这不是我想要的。我正在寻找一种“简单”的方法,将这种基于毫秒的时间戳转换为

将时间戳值(如
158675709496
转换为
2020年4月13日星期一11:01:49.496 AM

不幸的是,MacOs上的
date
工具预期的是秒,而不是毫秒,并且给出了错误的年份:

> date -r 1586775709496
Thu Dec  2 15:24:56 CET 52252
这个现有的工具只解释了显而易见的一点:您可以除以1000(从后面的3位数字中切掉),内置的
date
工具就可以工作了

但是:这不是我想要的。我正在寻找一种“简单”的方法,将这种基于毫秒的时间戳转换为“人类可读的”,包括毫秒。有没有办法做到这一点

timestamp=1586775709496
ms=$(( $timestamp % 1000 ))
echo "$(date -r  $(( $timestamp / 1000 )) +"%a, %b %d, %Y %H:%M:%S").$ms"
Mon, Apr 13, 2020 12:01:49.496

您可以编辑日期格式字符串,以获得所需的准确结果。

对于gnu date,我认为应该是:

$ a=1586775709496
$ LC_ALL=C date -u --date=@"$((a/1000)).$(printf "%03d" $((a%1000)))" +"%A, %B %2d, %Y %H:%M:%S.%3N %p"
Monday, April 13, 2020 11:01:49.496 PM
GNU date支持
%3N
,它只打印毫秒

我想,因为输入的最后3个字符正好在输出中,所以您可以在应该的位置输入它们,这样就不需要扩展名
%N

$ a=1586775709496;
$ LC_ALL=C date -u --date=@"$((a/1000))" +"%A, %B %2d, %Y %H:%M:%S.$(printf "%03d" $((a%1000))) %p"

您最好的选择可能是安装GNU
date
,它支持纳秒的
%N
格式:例如
date+%a%b%d%T.%N”--date@$(echo“scale=3;158675709496/1000”| bc)
输出
Mon Apr 13 07:01:49.496000000
。(不幸的是,没有直接的方法将
%N
添加到默认格式;您必须完整地重新创建它。)不管其他答案是什么,它都已被删除。我会将ms添加到编辑版本中。是的,这看起来确实更好。我也同意:brew/gdate不会增加依赖项。附录:为了让它正常工作,需要GNU日期。它可以通过“BREW安装CORUTILLS”来安装,然后你得到一个GDATE命令。我很好奇:你认为安装非标准(MACOS)函数是“直截了当的”吗?但是:如果您已经有了brew和brew coreutils,那么就很简单了。