Bagaimana saya bisa menghasilkan cap waktu Unix?


240

Pertanyaan terkait adalah "Datetime To Unix timestamp" , tetapi pertanyaan ini lebih umum.

Saya perlu cap waktu Unix untuk menyelesaikan pertanyaan terakhir saya . Minat saya adalah Python, Ruby, dan Haskell, tetapi pendekatan lain dipersilakan.

Apa cara termudah untuk menghasilkan cap waktu Unix?


Saya membuat alat online beberapa waktu lalu. quickhash.com/timestamp
AB Carroll

@ABCarroll Bisakah Anda jelaskan sebagai anwer bagaimana alat online Anda memberikan cap waktu Unix? Tolong, lampirkan manual dll untuk itu. Tampaknya memberikan banyak data tetapi saya tidak bisa benar-benar mengikuti apa targetnya.
Léo Léopold Hertz 준영

gettimeofdayadalah nama syscall POSIX dan Linux: stackoverflow.com/questions/11765301/... TODO: mengapa strace date +%dtidak menyebutnya?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jika Anda bekerja dengan, dan menambah rentang waktu (misalnya menit, hari, jam), saya menulis alat untuk saya gunakan sendiri baru-baru ini unixtime.ninja
Guy Thouret

Jawaban:


472

Di Linux atau MacOS Anda dapat menggunakan:

date +%s

dimana

  • +%s, detik sejak 1970-01-01 00:00:00 UTC. (GNU Coreutils 8.24 Tanggal manual)

Contoh keluaran sekarang 1454000043.


1
Pada Solaris: truss date 2> & 1 | grep ^ waktu | awk '{print $ 3}'
Ľubomír Mlích

Tanggal BSD mendukung juga +% s. Mungkin universal, seperti dateyang biasanya didefinisikan dalam POSIX.2.
Dereckson

@ ĽubomírMlích Pada host SmartOS (SunOS 5.11 joyent_20171026T003127Z), saya sudah /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` berfungsi. Digabungkan dengan rekomendasi POSIX.2, saya pikir ini juga berfungsi pada semua Solaris.
Dereckson

Catatan: untuk menambah 60 detik: date -v+60S +%suntuk menambah 1 hari: date -v+24H +%sdan seterusnya. . .
gMale

Bagaimana cara menghasilkan milidetik hingga 3 digit saja?
Parveen Verma

110

dalam Ruby:

>> Time.now.to_i
=> 1248933648

untuk rel bisa Anda gunakan Time.zone.now.to_i. Meskipun itu akan memberikan o / p yang sama seperti Time.now.to)_itetapi Time.zone.now.to_iadalah Railscaranya.
Swap

Dalam Rails, ./bin/rails runner "p Time.current.to_i"adalah solusi lain.
gipcompany

18

Dalam python tambahkan baris berikut untuk mendapatkan cap waktu:

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

17

curl icanhazepoch.com

Pada dasarnya itu cap waktu unix sebagai layanan (UTaaS)


3
Heh, bagus. Ini mengilhami saya untuk menambahkan fitur serupa ke situs hobi saya. curl -L -H "Accept: application/json" unixtimesta.mpakan memberi Anda{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson


8

Perintah 'tanggal' unix sangat serbaguna.

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

Mengambil output dari date, yang akan berada dalam format yang ditentukan oleh -f, dan kemudian mencetaknya (-j mengatakan jangan mencoba untuk mengatur tanggal) dalam bentuk +% s, detik sejak zaman.


4
date: invalid option -- 'j'
nyuszika7h

1
Itu ekstensi tanggal GNU, bukan dalam standar Unix (POSIX).
jlliagre

8
$ date +%s.%N

where (GNU Coreutils 8.24 Date manual)

  • +%s, detik sejak 1970-01-01 00:00:00 UTC
  • +%N, nanoseconds (000000000..999999999) sejak zaman

Contoh output sekarang 1454000043.704350695. Saya perhatikan bahwa manual BSD datetidak menyertakan penjelasan yang tepat tentang bendera +%s.


Mengapa Anda memasukkan nanodetik +$N? Apakah itu termasuk dalam cap waktu UNIX di beberapa sistem?
Léo Léopold Hertz 준영

2
FYI, %Ntidak mendokumentasikan halaman manual untuk tanggal di macOS 10.13.1 (High Sierra) dan tidak berfungsi. Output sampel aku adalah: 1523342391.N.
nishanths


7

Pertama-tama, 'zaman' Unix atau zero-time adalah 1970-01-01 00: 00: 00Z (artinya tengah malam tanggal 1 Januari 1970 di zona waktu Zulu atau GMT atau UTC). Cap waktu Unix adalah jumlah detik sejak saat itu - bukan terhitung detik kabisat.

Menghasilkan waktu saat ini di Perl agak mudah:

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

Menghasilkan waktu yang sesuai dengan tanggal / nilai waktu yang diberikan agak kurang mudah. Secara logis, Anda menggunakan strptime()fungsi dari POSIX. Namun, modul Perl POSIX :: strptime (yang terpisah dari modul POSIX) memiliki tanda tangan:

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

Fungsi mktimedalam modul POSIX memiliki tanda tangan:

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

Jadi, jika Anda tahu format data Anda, Anda bisa menulis varian di:

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


3

di Haskell

import Data.Time.Clock.POSIX

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

dalam Go

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

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

di Swift

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

2

Di Haskell ...

Untuk mendapatkannya kembali sebagai tipe POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Sebagai bilangan bulat:

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

Mari kita coba JavaScript :

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

... atau bahkan lebih baik, pendekatan statis:

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

Dalam kedua kasus saya membagi dengan 1000pergi dari detik ke millis dan saya gunakan Math.flooruntuk hanya mewakili seluruh detik yang telah berlalu (vs pembulatan, yang mungkin dibulatkan ke seluruh detik yang belum berlalu).


Ini salah. Kedua metode kembali millisecondsbukan detik dan cap waktu unix adalah jumlah secondsyang telah berlalu sejak 1 Januari 1970 00:00 UTC. Anda dapat menggunakan JS, cukup bagi 1000 dan bulat:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis pasti pre-coffee hari itu, saya telah memperbarui jawaban saya meskipun saya memilih untuk Math.floorbukan Math.round. Cheers
Madbreaks

0

Jika Anda memerlukan cap waktu Unix dari skrip shell (keluarga Bourne: sh, ksh, bash, zsh, ...), ini harus bekerja pada mesin Unix mana pun tidak seperti saran lainnya (perl, haskell, ruby, python, tanggal GNU) ), ini didasarkan pada perintah dan fitur standar POSIX.

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

0

Di Bash 5 ada variabel baru:

echo $EPOCHSECONDS

Atau jika Anda ingin presisi yang lebih tinggi (dalam mikrodetik):

echo $EPOCHREALTIME

0

Jika saya ingin mencetak waktu tanggal utc menggunakan perintah tanggal saya perlu menggunakan argumen -u dengan perintah tanggal.

Contoh

date -u

Keluaran

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Bekerja bahkan pada versi lama Solaris dan mungkin sistem UNIX lain, di mana '' tanggal +% s '' 'tidak diterapkan
  • Tidak berfungsi di Linux dan distro lain di mana alat posix telah diganti dengan versi GNU (nawk -> gawk dll.)
  • Cukup tidak intuitif tapi lucu :-)

-1

Dengan NodeJS, cukup buka terminal dan ketik:
node -e "console.log(new Date().getTime())"ataunode -e "console.log(Date.now())"

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.