Làm cách nào để tạo dấu thời gian Unix?


240

Câu hỏi liên quan là "Datetime to Unix timestamp" , nhưng câu hỏi này tổng quát hơn.

Tôi cần dấu thời gian Unix để giải quyết câu hỏi cuối cùng của tôi . Sở thích của tôi là Python, Ruby và Haskell, nhưng các cách tiếp cận khác đều được chào đón.

Cách dễ nhất để tạo dấu thời gian Unix là gì?


Tôi đã làm một công cụ trực tuyến một thời gian trước đây. quickhash.com/timestamp
AB Carroll

@ABCarroll Bạn có thể vui lòng giải thích như một anwer cách công cụ trực tuyến của bạn cung cấp dấu thời gian Unix không? Xin vui lòng, đính kèm một hướng dẫn vv cho nó. Nó dường như cung cấp rất nhiều dữ liệu nhưng tôi thực sự không thể làm theo mục tiêu là gì.
Léo Léopold Hertz

gettimeofdaylà tên tòa nhà POSIX và Linux: stackoverflow.com/questions/11765602/ TODO: tại sao strace date +%dkhông gọi nó?
Ciro Santilli 郝海东 冠状 病 事件

Nếu bạn làm việc với và các khoảng thời gian tăng dần (ví dụ: phút, ngày, giờ), tôi đã viết một công cụ để sử dụng riêng cho mình gần đây unixtime.ninja
Guy Thouret 26/03/19

Câu trả lời:


472

Trong Linux hoặc MacOS, bạn có thể sử dụng:

date +%s

Ở đâu

  • +%s, giây kể từ 1970-01-01 00:00:00 UTC. (Hướng dẫn sử dụng GNU Coreutils 8.24)

Ví dụ đầu ra bây giờ 1454000043.


1
Trên Solaris: vì kèo ngày 2> & 1 | grep ^ thời gian | awk '{in $ 3}'
Ľubomír Mlích

Ngày BSD cũng hỗ trợ +% s. Có lẽ là phổ quát, như datethường được định nghĩa trong POSIX.2.
Dereckson

@ ĽubomírMlích Trên máy chủ SmartOS (SunOS 5.11 joyent_20171026T003127Z), tôi đã cả /usr/bin/date +%s and / usr / xpg4 / bin / ngày +% s` hoạt động. Kết hợp với khuyến nghị POSIX.2, tôi nghĩ rằng điều này cũng hoạt động trên tất cả các Solaris.
Dereckson

Lưu ý: để thêm 60 giây: date -v+60S +%sthêm 1 ngày: date -v+24H +%svân vân. . .
gMale

Làm thế nào để tạo mili giây chỉ tối đa 3 chữ số?
Parveen Verma

110

trong Ruby:

>> Time.now.to_i
=> 1248933648

cho đường ray bạn có thể sử dụng Time.zone.now.to_i. Mặc dù nó sẽ cho o / p giống như Time.now.to)_inhưng Time.zone.now.to_iRailscách.
Hoán đổi

Trong Rails, ./bin/rails runner "p Time.current.to_i"là một giải pháp khác.
gipcompany

18

Trong python thêm các dòng sau để có được dấu thời gian:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

17

curl icanhazepoch.com

Về cơ bản, đó là dấu thời gian unix như một dịch vụ (UTaaS)


3
Heh, tốt đẹp. Điều này truyền cảm hứng cho tôi để thêm một tính năng tương tự vào trang web sở thích của tôi. curl -L -H "Accept: application/json" unixtimesta.mpsẽ cho bạn{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson


8

Lệnh "ngày" unix là linh hoạt đáng ngạc nhiên.

ngày -j -f "% a% b% d% T% Z% Y" "` ngày` "" +% s "

Lấy đầu ra của date, sẽ ở định dạng được xác định bởi -f và sau đó in ra (-j nói không cố gắng đặt ngày) ở dạng +% s, giây kể từ epoch.


4
date: invalid option -- 'j'
nyuszika7h

1
Đó là phần mở rộng ngày của GNU, không phải trong tiêu chuẩn Unix (POSIX).
jlliagre

8
$ date +%s.%N

trong đó (Hướng dẫn sử dụng GNU Coreutils 8.24)

  • +%s, giây kể từ 1970-01-01 00:00:00 UTC
  • +%N, nano giây (000000000..999999999) kể từ kỷ nguyên

Ví dụ đầu ra bây giờ 1454000043.704350695. Tôi nhận thấy rằng hướng dẫn sử dụng BSD datekhông bao gồm giải thích chính xác về cờ +%s.


Tại sao bạn bao gồm nano giây +$N? Có bao gồm trong dấu thời gian UNIX trong một số hệ thống không?
Léo Léopold Hertz

2
FYI, %Nkhông được ghi lại trang man cho ngày trong macOS 10.13.1 (High Sierra) và không hoạt động. Đầu ra mẫu tôi nhận được là : 1523342391.N.
nishanths

Trên macOS có gdatetrong Homebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov

7

Trước hết, Unix 'epoch' hoặc zero-time là 1970-01-01 00: 00: 00Z (nghĩa là nửa đêm ngày 1 tháng 1 năm 1970 theo múi giờ Zulu hoặc GMT hoặc UTC). Dấu thời gian Unix là số giây kể từ thời điểm đó - không chiếm số giây nhuận.

Tạo thời gian hiện tại trong Perl khá dễ dàng:

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

Tạo thời gian tương ứng với một giá trị ngày / thời gian nhất định là khá dễ dàng. Theo logic, bạn sử dụng strptime()chức năng từ POSIX. Tuy nhiên, mô-đun Perl POSIX :: strptime (tách biệt với mô-đun POSIX) có chữ ký:

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

Chức năng mktimetrong mô-đun POSIX có chữ ký:

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

Vì vậy, nếu bạn biết định dạng dữ liệu của mình, bạn có thể viết một biến thể trên:

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

4

Để hoàn thiện, PHP:

php -r 'echo time();'

Trong BASH:

clitime=$(php -r 'echo time();')
echo $clitime

1
Đối với bash, chúng tôi đã có datelệnh, vì vậy tôi không nghĩ cần phải gọi php từ đó.
fedorqui 'SO ngừng làm hại'

3

Haskell

import Data.Time.Clock.POSIX

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

trong đi

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

trong 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);

trong Swift

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

2

Trong Haskell ...

Để lấy lại dưới dạng POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Là một số nguyên:

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

Hãy thử JavaScript :

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

... Hoặc thậm chí đẹp hơn, cách tiếp cận tĩnh:

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

Trong cả hai trường hợp, tôi chia 1000cho nhau để đi từ giây đến millis và tôi sử dụng Math.floorđể chỉ đại diện cho toàn bộ giây đã trôi qua (so với làm tròn, có thể làm tròn đến cả giây chưa trôi qua).


Cái này sai. Cả hai phương thức đều trả về millisecondskhông phải giây và dấu thời gian unix là số lượng secondsđã trôi qua kể từ ngày 1 tháng 1 năm 1970 00:00 UTC. Bạn có thể sử dụng JS, chỉ cần chia cho 1000 và làm tròn:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis phải là cà phê trước ngày hôm đó, tôi đã cập nhật câu trả lời của mình mặc dù tôi đã chọn Math.floorthay vì Math.round. Chúc mừng
Madbreaks

0

Nếu bạn cần dấu thời gian Unix từ tập lệnh shell (họ Bourne: sh, ksh, bash, zsh, ...), thì điều này sẽ hoạt động trên bất kỳ máy Unix nào, không giống như các đề xuất khác (perl, haskell, ruby, python, GNU date ), nó dựa trên một lệnh và tính năng tiêu chuẩn POSIX.

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

0

Trong Bash 5 có một biến mới:

echo $EPOCHSECONDS

Hoặc nếu bạn muốn độ chính xác cao hơn (tính bằng micro giây):

echo $EPOCHREALTIME

0

Nếu tôi muốn in thời gian ngày utc bằng lệnh date, tôi cần sử dụng đối số -u với lệnh date.

Thí dụ

date -u

Đầu ra

Fri Jun 14 09:00:42 UTC 2019

0

chim ưng:

$ nawk 'BEGIN{print srand()}'
  • Hoạt động ngay cả trên các phiên bản cũ của Solaris và có thể là các hệ thống UNIX khác, trong đó '' 'ngày +% s' '' không được triển khai
  • Không hoạt động trên Linux và các bản phân phối khác trong đó các công cụ posix đã được thay thế bằng các phiên bản GNU (nawk -> gawk, v.v.)
  • Khá không trực quan nhưng chắc chắn gây cười :-)

-1

Với NodeJS, chỉ cần mở một thiết bị đầu cuối và gõ:
node -e "console.log(new Date().getTime())"hoặcnode -e "console.log(Date.now())"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.