Dapatkan waktu saat ini dalam hitungan detik sejak Zaman di Linux, Bash

634

Saya butuh sesuatu yang sederhana seperti date , tetapi dalam hitungan detik sejak tahun 1970 alih-alih tanggal, jam, menit, dan detik saat ini.

datesepertinya tidak menawarkan opsi itu. Apakah ada cara mudah?

n-alexander
sumber
22
Maaf, saya harus mengatakan ini .... '' Tanggal sepertinya tidak menawarkan opsi itu. Apakah ada cara mudah? '' - baca manual lagi ;-)
TheBonsai
7
Beberapa versi tanggal memilikinya dan beberapa tidak. Jadi tidak selalu ada. Saya menjalankan 'ketik-tanggal' dan menggunakan versi yang berbeda dan itu berhasil.
Scott Rowley
1
FWIW, Ubuntu hanya memiliki / bin / date, yang jawabannya @ Steef bekerja
Jonathan Hartley
1
@TheBonsai yang bukan bagian dari versi standar POSIX dari alat 'date'. Hanya karena versi Anda memilikinya (mungkin GNU), Anda seharusnya tidak menganggap implementasi semua orang lakukan.
Wyatt8740

Jawaban:

1160

Ini seharusnya bekerja:

date +%s
Aduh
sumber
45
manpge tanggal harus diubah dari %s seconds since 1970-01-01 00:00:00 UTCmenjadi %s seconds since the epoch, 1970-01-01 00:00:00 UTCkarena saya melewatkannya di sana.
devin
3
Tidak bekerja untuk saya. man date tidak menunjukkan% s. Saya harus memiliki versi bash yang sangat lama (3.2.51 (1) untuk Solaris)?
livefree75
7
@ livefree75 datetidak terintegrasi bash, jadi versi Anda bashtidak ada hubungannya dengan dateimplementasi yang dikirimkan oleh sistem Anda.
Adrian Frühwirth
11
Dan jika Anda ingin fraksi detik, ke sembilan tempat desimal, gunakan:date +%s.%N
Jonathan Hartley
19
Untuk milidetik gunakandate +%s%3N
Juan Campa
133

Hanya untuk menambahkan.

Dapatkan detik sejak zaman (1 Januari 1970) untuk tanggal tertentu (mis. 21 Oktober 1973).

date -d "Oct 21 1973" +%s


Konversi jumlah detik kembali ke tanggal

date --date @120024000


Perintahnya datecukup fleksibel. Hal keren lainnya yang dapat Anda lakukan dengan tanggal (tanpa malu disalin dari date --help). Tunjukkan waktu setempat untuk pukul 09:00 Jumat depan di pantai barat AS

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Lebih baik lagi, luangkan waktu untuk membaca halaman manual http://man7.org/linux/man-pages/man1/date.1.html

pellucide
sumber
Ini bukan pertanyaan OP, tetapi menjawab pertanyaan saya, jadi +1 dari saya.
AnthonyD973
Mungkin ini versi dateatau karena saya menggunakan zsh(macOS Catalina) tetapi ini tidak berhasil untuk saya. Menjalankan $ date -d "Oct 21 1973" +%soutputusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter
43

Sejauh ini, semua jawaban menggunakan program eksternal date .

Sejak Bash 4.2, printfmemiliki pengubah baru %(dateformat)Tyang, ketika digunakan dengan argumen -1menghasilkan tanggal saat ini dengan format yang diberikan oleh dateformat, ditangani oleh strftime(3)(man 3 strftime untuk informasi tentang format).

Jadi, untuk solusi Bash murni:

printf '%(%s)T\n' -1

atau jika Anda perlu menyimpan hasilnya dalam variabel var:

printf -v var '%(%s)T' -1

Tidak ada program eksternal dan tidak ada subkulit!

Sejak Bash 4.3, bahkan dimungkinkan untuk tidak menentukan -1:

printf -v var '%(%s)T'

(Tapi mungkin lebih bijaksana untuk selalu memberikan argumen -1 ).

Jika Anda menggunakan -2sebagai argumen alih-alih -1, Bash akan menggunakan waktu shell dimulai bukan tanggal saat ini. Ini dapat digunakan untuk menghitung waktu yang telah berlalu

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
gniourf_gniourf
sumber
9
Anda ingin menggunakan -2jika Anda memiliki pekerjaan yang berjalan lebih lama (pikirkan skrip untuk mengontrol cadangan Anda) dan kirim email pada akhirnya "Pencadangan dimulai pada $ kapan saja selesai pada $ sekarang" - yang dapat dicapai dengan -2menghindari menyimpan sebuah variabel khusus di awal.
Sebastian J.
24

Solusi bash murni

Sejak bash5.0 ( dirilis pada 7 Jan 2019 ) Anda dapat menggunakan variabel bawaan EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Ada juga EPOCHREALTIMEyang termasuk pecahan detik.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEdapat dikonversi ke mikro-detik (μs) dengan menghapus titik desimal. Ini mungkin menarik ketika menggunakan basharitmatika bawaan (( expression ))yang hanya dapat menangani bilangan bulat.

$ echo ${EPOCHREALTIME/./}
1547624774371215

Dalam semua contoh dari atas, nilai waktu yang dicetak sama untuk keterbacaan yang lebih baik. Pada kenyataannya, nilai waktu akan berbeda karena setiap perintah membutuhkan sedikit waktu untuk dieksekusi.

Socowi
sumber
Untuk resolusi milidetik (format sama dengan date +%s%3N), Anda dapat menggunakanecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
23

Dengan sebagian besar implementasi Awk:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
sumber
21
Wow itu tidak jelas
ericslaw
8
Wow, harus melihat yang ini. Ini adalah solusi pragmatis, tetapi belum tentu bagus / portabel. Tampaknya implementasi awksrand() biasanya diunggulkan dengan tanggal / waktu saat ini. Panggilan kedua untuk srand()mengembalikan nilai yang sebelumnya digunakan sebagai seed.
Ryan Ransford
19

Ini adalah ekstensi dari apa yang telah dilakukan @pellucide, tetapi untuk Mac:

Untuk menentukan jumlah detik sejak zaman (1 Januari 1970) untuk tanggal tertentu (mis. 21 Oktober 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

Harap dicatat, bahwa untuk kelengkapan, saya telah menambahkan bagian waktu ke format. Alasannya adalah bahwa dateakan mengambil bagian tanggal apa pun yang Anda berikan dan menambahkan waktu saat ini ke nilai yang diberikan. Misalnya, jika Anda menjalankan perintah di atas pada pukul 16:19, tanpa bagian '00: 00: 00 ', itu akan menambah waktu secara otomatis. Sehingga "21 Oktober 1973" akan diuraikan sebagai "21 Oktober 1973 16:19:00". Itu mungkin bukan yang Anda inginkan.

Untuk mengubah stempel waktu Anda kembali ke tanggal:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

Halaman manual Apple untuk implementasi tanggal: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

PeqNP
sumber
1
Agar lebih jelas, ini untuk dateperintah BSD , sedangkan solusi yang disarankan date -dadalah untuk GNU date. Tanggal BSD di macOS berasal dari FreeBSD , dan berbagi sejumlah opsi dengan NetBSD dan OpenBSD. Dan ini sepenuhnya terpisah dari bash.
ghoti
yang %Npilihan yang disebutkan untuk detik pecahan di tanggal gnu hilang dari tanggal MacOS. Pada 10.14, tidak ada format di halaman manual; mereka ada di strftime(3)halaman manual, yang tidak akan Anda miliki jika Anda belum menginstal Xcode, dan mungkin tidak melihat dengan perintah man bahkan jika Anda melakukannya.
Dan Pritts
1

gunakan skrip bash ini (saya ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
comonad
sumber