如何生成 Unix 时间戳?
Posted
技术标签:
【中文标题】如何生成 Unix 时间戳?【英文标题】:How can I generate Unix timestamps? 【发布时间】:2010-11-15 08:03:40 【问题描述】:相关问题是"Datetime To Unix timestamp",不过这个问题比较笼统。
我需要 Unix 时间戳来解决我的last question. 我的兴趣是 Python、Ruby 和 Haskell,但欢迎使用其他方法。
生成 Unix 时间戳的最简单方法是什么?
【问题讨论】:
@A.B.Carroll 您能否解释一下您的在线工具如何提供 Unix 时间戳?请附上手册等。它似乎提供了很多数据,但我无法真正了解目标是什么。gettimeofday
是 POSIX 和 Linux 系统调用名称:***.com/questions/11765301/… TODO:为什么 strace date +%d
不调用它?
如果您使用并增加时间范围(例如分钟、天、小时),我最近编写了一个工具供我自己使用 unixtime.ninja
【参考方案1】:
在 Ruby 中:
>> Time.now.to_i
=> 1248933648
【讨论】:
对于rails,您可以使用Time.zone.now.to_i
。虽然它会提供与Time.now.to)_i
相同的o/p,但Time.zone.now.to_i
是Rails
方式。
在 Rails 中,./bin/rails runner "p Time.current.to_i"
是另一种解决方案。【参考方案2】:
首先,Unix 的“纪元”或零时间是 1970-01-01 00:00:00Z(在 Zulu 或 GMT 或 UTC 时区表示 1970 年 1 月 1 日的午夜)。 Unix 时间戳是自该时间以来的秒数 - 不考虑闰秒。
在 Perl 中生成当前时间相当简单:
perl -e 'print time, "\n"'
生成与给定日期/时间值对应的时间并不容易。从逻辑上讲,您使用 POSIX 中的 strptime()
函数。但是,Perl POSIX::strptime 模块(与 POSIX 模块分开)具有签名:
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) =
POSIX::strptime("string", "Format");
POSIX模块中的函数mktime
有签名:
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】:unix 'date' 命令的用途非常广泛。
日期 -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"获取date
的输出,它将采用-f 定义的格式,然后以+%s 的形式打印出来(-j 表示不要尝试设置日期),自纪元以来的秒数.
【讨论】:
date: invalid option -- 'j'
这是 GNU 日期扩展,不是 Unix 标准 (POSIX)。【参考方案4】:
在 Perl 中:
>> time
=> 1335552733
【讨论】:
【参考方案5】:在python中添加以下行以获得时间戳:
>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993
【讨论】:
【参考方案6】:在 Linux 或 MacOS 中您可以使用:
date +%s
在哪里
+%s
,自 1970-01-01 00:00:00 UTC 以来的秒数。 (GNU Coreutils 8.24 日期手册)
现在的示例输出为 1454000043。
【讨论】:
在 Solaris 上:桁架日期 2>&1 | grep ^时间 | awk 'print $3' BSD 日期也支持 +%s。可能是通用的,因为date
通常在 POSIX.2 中定义。
@ĽubomírMlích 在 SmartOS 主机 (SunOS 5.11 joyent_20171026T003127Z) 上,/usr/bin/date +%s and
/usr/xpg4/bin/date +%s` 都在工作。结合 POSIX.2 建议,我认为这也适用于所有 Solaris。
注:加60秒:date -v+60S +%s
加1天:date -v+24H +%s
等。 . .
如何只生成最多 3 位的毫秒数?【参考方案7】:
在 Haskell 中...
将其作为 POSIXTime 类型返回:
import Data.Time.Clock.POSIX
getPOSIXTime
作为整数:
import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime
【讨论】:
【参考方案8】: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;
【讨论】:
【参考方案9】:如果您需要来自 shell 脚本(Bourne 系列:sh、ksh、bash、zsh、...)的 Unix 时间戳,这应该可以在任何 Unix 机器上工作,这与其他建议(perl、haskell、ruby、python)不同, GNU 日期),它基于 POSIX 标准命令和功能。
PATH=`getconf PATH` awk 'BEGIN srand();print srand()'
【讨论】:
【参考方案10】:curl icanhazepoch.com
基本上它是 unix 时间戳即服务 (UTaaS)
【讨论】:
嘿,很好。这启发了我在我的爱好网站上添加一个类似的功能。curl -L -H "Accept: application/json" unixtimesta.mp
会给你"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681
【参考方案11】:
为了完整起见,php:
php -r 'echo time();'
在 BASH 中:
clitime=$(php -r 'echo time();')
echo $clitime
【讨论】:
对于 bash,我们已经有了date
命令,所以我认为没有必要从那里调用 php。【参考方案12】:
$ date +%s.%N
哪里(GNU Coreutils 8.24 日期手册)
+%s
,自 1970-01-01 00:00:00 UTC 以来的秒数
+%N
,自纪元以来的纳秒 (000000000..999999999)
现在输出示例1454000043.704350695
。
我注意到date
的 BSD 手册没有包含关于标志 +%s
的精确解释。
【讨论】:
为什么+$N
包含纳秒?它是否包含在某些系统的 UNIX 时间戳中?
仅供参考,%N
没有在 macOS 10.13.1 (High Sierra) 中记录日期的手册页并且不起作用。我得到的示例输出是:1523342391.N
.
在 macOS 上有 gdate
在 Homebrew apple.stackexchange.com/a/135749/181223【参考方案13】:
在Haskell
import Data.Time.Clock.POSIX
main :: IO ()
main = print . floor =<< getPOSIXTime
在Go
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);
在Swift
NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970
【讨论】:
【参考方案14】:我们试试javascript:
var t = Math.floor((new Date().getTime()) / 1000);
...或者更好的是,静态方法:
var t = Math.floor(Date.now() / 1000);
在这两种情况下,我除以 1000
以从秒变为毫秒,我使用 Math.floor
仅表示已过去的整秒(与舍入相比,舍入可能会舍入到尚未过去的整秒但是)。
【讨论】:
这是错误的。两种方法都返回milliseconds
而不是秒,unix 时间戳是自 1970 年 1 月 1 日 00:00 UTC 以来经过的 seconds
的数量。可以用JS,除以1000四舍五入:Math.round(Date.now()/1000)
@LukasLiesis 那天一定是喝过咖啡的,尽管我选择了Math.floor
而不是Math.round
,但我已经更新了我的答案。干杯【参考方案15】:
使用 NodeJS,只需打开终端并输入:node -e "console.log(new Date().getTime())"
或 node -e "console.log(Date.now())"
【讨论】:
【参考方案16】:在 Bash 5 中有一个新变量:
echo $EPOCHSECONDS
或者如果您想要更高的精度(以微秒为单位):
echo $EPOCHREALTIME
【讨论】:
【参考方案17】:如果我想使用 date 命令打印 utc 日期时间,我需要在 date 命令中使用 -u 参数。
例子
date -u
输出
Fri Jun 14 09:00:42 UTC 2019
【讨论】:
【参考方案18】:纳克:
$ nawk 'BEGINprint srand()'
甚至可以在旧版本的 Solaris 和可能的其他 UNIX 系统上工作,其中没有实现 '''date +%s'''
不适用于 Linux 和其他已将 posix 工具替换为 GNU 版本(nawk -> gawk 等)的发行版
相当不直观,但绝对有趣:-)
【讨论】:
【参考方案19】:对于类 Unix 环境,以下将起作用。
# Current UNIXTIME
unixtime()
datetime2unixtime "$(date -u +'%Y-%m-%d %H:%M:%S')"
# From DateTime(%Y-%m-%d %H:%M:%S)to UNIXTIME
datetime2unixtime()
set -- "$1%% *" "$1##* "
set -- "$1%%-*" "$1#*-" "$2%%:*" "$2#*:"
set -- "$1" "$2%%-*" "$2#*-" "$3" "$4%%:*" "$4#*:"
set -- "$1" "$2#0" "$3#0" "$4#0" "$5#0" "$6#0"
[ "$2" -lt 3 ] && set -- $(( $1-1 )) $(( $2+12 )) "$3" "$4" "$5" "$6"
set -- $(( (365*$1)+($1/4)-($1/100)+($1/400) )) "$2" "$3" "$4" "$5" "$6"
set -- "$1" $(( (306*($2+1)/10)-428 )) "$3" "$4" "$5" "$6"
set -- $(( ($1+$2+$3-719163)*86400+$4*3600+$5*60+$6 ))
echo "$1"
# From UNIXTIME to DateTime format(%Y-%m-%d %H:%M:%S)
unixtime2datetime()
set -- $(( $1%86400 )) $(( $1/86400+719468 )) 146097 36524 1461
set -- "$1" "$2" $(( $2-(($2+2+3*$2/$3)/$5)+($2-$2/$3)/$4-(($2+1)/$3) ))
set -- "$1" "$2" $(( $3/365 ))
set -- "$@" $(( $2-( (365*$3)+($3/4)-($3/100)+($3/400) ) ))
set -- "$@" $(( ($4-($4+20)/50)/30 ))
set -- "$@" $(( 12*$3+$5+2 ))
set -- "$1" $(( $6/12 )) $(( $6%12+1 )) $(( $4-(30*$5+3*($5+4)/5-2)+1 ))
set -- "$2" "$3" "$4" $(( $1/3600 )) $(( $1%3600 ))
set -- "$1" "$2" "$3" "$4" $(( $5/60 )) $(( $5%60 ))
printf "%04d-%02d-%02d %02d:%02d:%02d\n" "$@"
# Examples
unixtime # => Current UNIXTIME
date +%s # Linux command
datetime2unixtime "2020-07-01 09:03:13" # => 1593594193
date -u +%s --date "2020-07-01 09:03:13" # Linux command
unixtime2datetime "1593594193" # => 2020-07-01 09:03:13
date -u --date @1593594193 +"%Y-%m-%d %H:%M:%S" # Linux command
https://tech.io/snippet/a3dWEQY
【讨论】:
【参考方案20】:在锈中:
use std::time::SystemTime, UNIX_EPOCH;
fn main()
let now = SystemTime::now();
println!("", now.duration_since(UNIX_EPOCH).unwrap().as_secs())
【讨论】:
以上是关于如何生成 Unix 时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?