题 如何在bash中以毫秒为单位获取当前的Unix时间?


如何获得当前的Unix时间(以毫秒为单位)(即1970年1月1日Unix时代以来的毫秒数)?


197
2018-06-14 16:04






答案:


这个:

date +%s 

将返回的数量  从那个时代开始。

这个:

date +%s%N

返回秒和当前纳秒。

所以:

date +%s%N | cut -b1-13

将给出自纪元以来的毫秒数 - 当前秒数加上纳秒数的左三。


MikeyB  - echo $(($(date +%s%N)/1000000)) (除以1000只能带来微秒)


233
2018-06-14 16:10



我想知道削减了多少ms :-) - Kyle Brandt♦
或者如果你想在shell中完成所有操作,避免额外进程的昂贵开销(实际上,当%+ s + N中的位数改变时我们避免了这个问题): echo $(($(date +%s%N)/1000)) - MikeyB
这是问题的原则......避免使用魔法数字并编码你的实际内容 意思。 - MikeyB
我认为值得注意的是,该男子要求使用Unix,而不是Linux,而目前的最佳答案(日期+%s%N)在我的AIX系统上不起作用。 - Pete
@Pete +1与OS X和FreeBSD相同 - ocodo


你可以简单地使用 %3N 将纳秒截断为3个最高有效位(然后是毫秒):

$ date +%s%3N
1397392146866

这有效,例如在我的kubuntu 12.04上。

但请注意,那 %N 可能无法实施,具体取决于您的目标系统。 例如。在嵌入式系统上测试(buildroot rootfs,使用非HF手臂交叉工具链编译)没有 %N

$ date +%s%3N
1397392146%3N

(而且我的(非根)Android平板电脑没有 %N)。


79
2018-04-13 12:34



@warren:我看到你编辑并改变了 1397392146%3N 至 1397392146%N,但输出 1397392146%3N 是我在Android平板电脑的busybox控制台上真正看到的。你能解释一下你的编辑吗? - Joe
沃伦的历史评论“从3变为6,因为3只需要你到微秒”。他的编辑似乎完全是虚假的;你应该回滚。 - bukzor
这是GNU coreutils的一个特性。最终,这是在gnulib中实现的: github.com/gagern/gnulib/blob/...。 - telotortium
可能在那里有一个点是有道理的。 date +%s.%3N 版画 1510718281.134。 - darksky


date +%N 在OS X上不起作用,但你可以使用其中一个

  • 红宝石: ruby -e 'puts Time.now.to_f'
  • 蟒蛇: python -c 'import time; print time.time()'
  • Node.js的: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • 互联网: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • 或者以毫秒为单位舍入到最接近的秒 date +%s000

51
2017-09-02 11:16



为了完整...... node -e 'console.log(Date.now())' - slf
使用PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
当然,你只需要等待那些口译员热身。这也有效: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
或者,如果你 实际上并不需要毫秒 但只是正确的格式: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/... 有关于通过Brew的OSX执行此操作的说明 coreutils - sameers


把它扔到那里,但我认为这个部门的正确公式是:

echo $(($(date +%s%N)/1000000))

8
2017-09-07 21:22





我的解决方案不是最好的,但对我有用。

date +%s000

我只需要将2012-05-05之类的日期转换为毫秒。


6
2018-05-09 20:11



惊人的黑客,哈哈:) - k06a
你必须是我同事中的某个人。 - Nakilon


对于那些建议运行外部程序来获取的人 秒...按照这个速度,你可以这样做:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

重点是:在从这里选择任何答案之前,请记住并非所有程序都会在一秒钟内运行。测量!


6
2018-06-23 13:17



你不是在问当地的系统。我猜这个暗示在这个问题中。您还依赖于网络连接。 - orkoden
@orkoden这个问题明确要求“自1970年1月1日Unix时代以来的毫秒数”。另外,我更多的是指出你不应该只是为了获得时间来启动整个Ruby或Python(或wget) - 要么通过快速通道完成,要么毫秒无关紧要。 - Camilo Martin
是的,我明白你提供了一个更糟糕的解决方案,以突出不良解决方案的缺陷。我尝试了几种解决方案并测量了时间。 lpaste.net/119499 结果很有意思。即使在非常快的i7机器上 date 需要3毫秒才能运行。 - orkoden
@orkoden不错的测试!什么OS?这可能与进程生成开销有关。 - Camilo Martin
@Nakilon这就是为什么人们不应该依赖像任何生产那样的可卷曲的便利。 - Camilo Martin


此解决方案适用于macOS。

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

#!/bin/bash

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

3
2018-02-05 14:26



为什么投票失败? - Frank Thonig
似乎没有特别合理。向下箭头上的提示说“这个答案没有用”,但IMO很有用。也许他们希望你把它变成Python脚本。这将更简单,也可以作为bash命令正常工作。 - Andrew Schulman
不要太担心downvotes(它不是​​我的)...特别是如果它们是匿名的(从哪个人无法了解看似错误的东西,对吧?)。只是为了让你处理它...这里再来+1 ......猜猜:你现在也被允许“投票”,对吧? - Pierre.Vriens
downvote似乎是由系统问题引起的。此后,它已被系统删除。 - Michael Hampton♦


如果您正在寻找显示脚本运行时间长度的方法,则以下内容将提供(不完全准确)结果:

尽可能靠近脚本的开头,输入以下内容

basetime=$(date +%s%N)

这将给你一个像1361802943996000000这样的起始值

在脚本的末尾,使用以下内容

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

这将显示类似的东西

runtime: 12.383 seconds

笔记:

如果您愿意,(1 * 10 ^ 09)可以替换为1000000000

"scale=3" 是一种相当罕见的强制设定 bc 做你想做的事。还有更多!

我只在Win7 / MinGW上测试过这个...我没有合适的* nix框。


2
2018-02-25 14:48



或者你可以使用 time <script> - warren