自终端中的纪元以来的时间(以毫秒为单位)


42

如何获得自纪元以来在OSX终端中的时间(以毫秒为单位)?

Linux / Ubuntu等效于date +%s.%N

Linux $ date +%s.%N
1403377762.035521859

这在我的OSX终端中不起作用:

OSX $ date +%s.%N
1403377800.N

Answers:


48

dateOS X中的程序不同于GNU的coreutils date程序。您可以安装coreutils(包括gnu-date),那么您将拥有一个date支持毫秒的版本。

由于对于原始OS X用户而言,从源代码进行安装可能会很麻烦,因此建议您使用Homebrew

要使用Homebrew安装这些工具,请在终端中运行以下oneliner:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

现在已安装Homebrew(明智的做法是在安装后遵循安装程序的建议)。现在,我们将使用来安装coreutils brew

brew install coreutils

如安装所述,所有命令都已安装了前缀“ g”(例如gdate,gcat,gln等)。如果您确实需要使用这些命令的常规名称,则可以在PATH(~/.bash_profile)中添加一个“ gnubin”目录,例如:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

您现在可以运行

gdate +%s.%N

这将输出自纪元以来的时间(以毫秒为单位)。


3
真好 我什至不必添加gdate安装在中的路径/usr/local/bin/gdate
亚当·马坦

那就是您所期望的。所有二进制文件都带有g前缀。在提供的路径中,所有相同的gnu-coreutils都没有g前缀。因此,如果将其添加到PATH =“ / usr / local / opt / coreutils / libexec / gnubin:$ PATH”这样的路径中,它将替换原始文件。因此OS X date成为GNU date(而不是gdate)
CousinCocaine

很好,它解决了。
CousinCocaine 2014年

3
从技术上讲,该+%s.%N格式将秒精确到纳秒,而不是毫秒。在使用brew安装之后gdate,我检查了联机帮助页以查看是否有毫秒。不是。它还没有说%N可以指定的精度,但是无论如何我还是尝试了。我发现将秒仅降低到毫秒精度(即小数点后三位)的命令是gdate +%s.%3N
LS

10

在OS X中,仅date +%s当OS X date的输出不支持其精度时才运行,并且内部表示形式不支持的任何多余精度都将被截断为负无穷大。

如果需要毫秒输出,则可以使用以下命令,尽管由于上述原因,仅通过添加零而不是增加精度来纠正输出。以下内容在支持必要精度的系统上确实输出正确的毫秒数。

echo $(($(date +'%s * 1000 + %-N / 1000000')))

上面命令的源代码:Unix.SE –如何从Unix时代获取毫秒数

如果只想在OS X中添加正确数量的零的命令,则可以使用:

date +%s000

OS X不支持%-N,因此不执行任何操作(如果$N设置了shell变量,可能会造成麻烦)。只需使用date +%s000(或date +%s.000如果您想要小数点)。
Gordon Davisson 2014年

@Gordon是的,我提到了这一点,但是,如果OP正在寻找一种可在这种精度的系统上成功运行的便携式解决方案,则上述命令有效。当然,您可以简单地将零附加到输出,但是将其复制到可能支持额外精度的其他系统将不是理想的选择。
grg

知道了 但是由于OS X的date命令仅%-N通过as 传递N,因此会干扰计算。尝试设置N=7000000000000000000,然后尝试命令...在实践中这是不太可能的情况,但是对于不依赖于环境的某些东西,我会感到更加安全。
Gordon Davisson 2014年

@Gordon的确,设置变量会破坏它—我想可以在命令运行之前重设特定的变量,但是这样复位变量是每个好的脚本在运行命令之前都应该执行的操作,以防万一。当然,所有这些都是基于我的假设,即OP想要一个脚本-经过编辑的答案,其中包括零的字面附加。
grg

2
OP要求“自纪元以来的时间(以毫秒为单位)”,这是有关如何在字符串中添加零的答案。不一样。尽管在帖子中进行了解释,但并未回答问题。
CousinCocaine 2014年

6

此解决方案可在macOS上使用。

如果您考虑使用bash脚本并提供python,则可以使用以下代码:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

python直接编写脚本:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perl无处不在。

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.