如何生成Unix时间戳?


240

相关问题是“ Datetime To Unix timestamp”,但是这个问题比较笼统。

我需要Unix时间戳来解决我的最后一个问题。我感兴趣的是Python,Ruby和Haskell,但欢迎其他方法。

生成Unix时间戳最简单的方法是什么?


我前段时间做了一个在线工具。 quickhash.com/timestamp-AB
卡罗尔

@ABCarroll您能否回答一下,您的在线工具如何提供Unix时间戳?请附上手册等。它似乎提供了很多数据,但我不能真正遵循目标。
莱奥列奥波尔德·赫兹준 영

gettimeofdayPOSIX和Linux系统调用的名称是:stackoverflow.com/questions/11765301/…TODO:为什么strace date +%d不调用它?
西罗Santilli郝海东冠状病六四事件法轮功

如果您使用它并增加时间范围(例如,分钟,天,小时),我最近为unixtime.ninja
Guy Thouret

Answers:


472

在Linux或MacOS中,您可以使用:

date +%s

哪里

  • +%s,自1970-01-01 00:00:00 UTC以来的秒数。(GNU Coreutils 8.24日期手册)

示例输出现在为1454000043。


1
在Solaris上:truss date 2>&1 | grep ^ time | awk'{print $ 3}'
ĽubomírMlích'16

BSD日期也支持+%s。可能是通用的,date通常在POSIX.2中定义。
德雷克森(Dereckson)

@ĽubomírMlích在SmartOS主机(SunOS 5.11 joyent_20171026T003127Z)上,/usr/bin/date +%s and / usr / xpg4 / bin / date +%s`都在工作。结合POSIX.2建议,我认为这也适用于所有Solaris。
Dereckson

注意:增加60秒:date -v+60S +%s增加1天:date -v+24H +%s以此类推。。。
gMale

如何仅产生最多3位的毫秒数?
Parveen Verma,

110

在Ruby中:

>> Time.now.to_i
=> 1248933648

您可以使用轨道Time.zone.now.to_i。虽然它会给出同样的O / P为Time.now.to)_iTime.zone.now.to_i为的Rails方式。
互换

在Rails中,./bin/rails runner "p Time.current.to_i"是另一种解决方案。
gipcompany


17

curl icanhazepoch.com

基本上是unix时间戳即服务(UTaaS)


3
嘿,很好。这启发了我向自己的爱好网站添加类似功能。curl -L -H "Accept: application/json" unixtimesta.mp会给你{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson '18


8

Unix的“ date”命令具有惊人的通用性。

date -j -f“%a%b%d%T%Z%Y”“`date`”“ +%s”

取得的输出date,该输出将采用-f定义的格式,然后以+%s的形式将其打印出来(-j说不要尝试设置日期),以秒为单位。


4
date: invalid option -- 'j'
nyuszika7h 2014年

1
那是GNU日期扩展,不是Unix标准(POSIX)。
jlliagre 2014年

8
$ date +%s.%N

在哪里(GNU Coreutils 8.24日期手册)

  • +%s,自1970-01-01 00:00:00 UTC以来的秒数
  • +%N,自纪元以来为纳秒(000000000..999999999)

现在输出示例1454000043.704350695。我注意到BSD手册中date未包含有关该标志的准确说明+%s


为什么要加上纳秒+$N?在某些系统中,它是否包含在UNIX时间戳中?
莱奥波德·赫兹(LéoLéopoldHertz)2016年

2
仅供参考,%NmacOS 10.13.1(High Sierra)中没有记录有关日期的手册页,因此无法正常工作。我得到的样本输出是:1523342391.N
nishanths '18


7

首先,Unix的“时代”或零时间是1970-01-01 00:00:00Z(表示1970年1月1日午夜在Zulu或GMT或UTC时区)。Unix时间戳是自该时间以来的秒数-不计leap秒。

在Perl中生成当前时间非常容易:

perl -e 'print time, "\n"'

生成与给定日期/时间值相对应的时间相当不容易。从逻辑上讲,您可以使用strptime()POSIX中的功能。但是,Perl POSIX :: strptime模块(与POSIX模块分开)具有签名:

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

mktimePOSIX模块中的功能具有签名:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

因此,如果您知道数据的格式,则可以编写以下变量:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'


3

Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

围棋

import "time"
t := time.Unix()

C

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

斯威夫特

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

2

在Haskell ...

要将其恢复为POSIXTime类型:

import Data.Time.Clock.POSIX
getPOSIXTime

作为整数:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime

2
public static Int32 GetTimeStamp()
    {
        try
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return 0;
        }
    }

2

让我们尝试JavaScript

var t = Math.floor((new Date().getTime()) / 1000);

...甚至更好的静态方法:

var t = Math.floor(Date.now() / 1000);

在这两种情况下,我都用1000秒除以毫秒,而我Math.floor只用来表示已过去的整秒(与舍入有关,后者可能舍入到还没有过去的一整秒)。


错了 两种方法都milliseconds不会返回秒数,而unix时间戳是seconds自1970年1月1日00:00 UTC以来已过去的数字。您可以使用JS,将其除以1000并四舍五入:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis一定是那天的前咖啡,尽管我选择了Math.floor而不是,但我已经更新了答案Math.round。干杯
Madbreaks

0

如果您需要shell脚本(Bourne家族:sh,ksh,bash,zsh等)的Unix时间戳,则它应该可以在任何Unix机器上正常工作,这与其他建议(perl,haskell,ruby,python,GNU date)不同),它基于POSIX标准命令和功能。

PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'

0

在Bash 5中,有一个新变量:

echo $EPOCHSECONDS

或者,如果您想要更高的精度(以微秒为单位):

echo $EPOCHREALTIME

0

如果要使用date命令打印utc日期时间,则需要在date命令中使用-u参数。

date -u

输出量

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • 即使在旧版本的Solaris和其他可能未实现'''date +%s'''的UNIX系统上也可以使用
  • 在posix工具已被GNU版本(nawk-> gawk等)替换的Linux和其他发行版上不起作用
  • 相当不直观,但绝对有趣:-)

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.