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?

Léo Léopold Hertz 준영
sumber
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.

Naresh
sumber
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
bb
sumber
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
Steven Kryskalla
sumber
17

curl icanhazepoch.com

Pada dasarnya itu cap waktu unix sebagai layanan (UTaaS)

Hut8
sumber
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
12

Dalam Perl:

>> time
=> 1335552733
davidchambers
sumber
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.

Alan Horn
sumber
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.

Masi
sumber
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
Di macOS ada gdatedi Homebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov
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"'
Jonathan Leffler
sumber
4

Untuk kelengkapan, PHP:

php -r 'echo time();'

Dalam BASH:

clitime=$(php -r 'echo time();')
echo $clitime
Mike Mackintosh
sumber
1
untuk bash kita sudah memiliki dateperintah, jadi saya pikir tidak perlu memanggil php dari sana.
fedorqui 'SO berhenti merugikan'
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
ZagNut
sumber
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
Tom Morris
sumber
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;
        }
    }
Rúben Jerónimo
sumber
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).

Madbreaks
sumber
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()}'
Jlliagre
sumber
0

Di Bash 5 ada variabel baru:

echo $EPOCHSECONDS

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

echo $EPOCHREALTIME
Colera Su
sumber
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
Viraj Wadate
sumber
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 :-)
pez
sumber
-1

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

Dusan Jovanov
sumber