Saya butuh sesuatu yang sederhana seperti date
, tetapi dalam hitungan detik sejak tahun 1970 alih-alih tanggal, jam, menit, dan detik saat ini.
date
sepertinya tidak menawarkan opsi itu. Apakah ada cara mudah?
Saya butuh sesuatu yang sederhana seperti date
, tetapi dalam hitungan detik sejak tahun 1970 alih-alih tanggal, jam, menit, dan detik saat ini.
date
sepertinya tidak menawarkan opsi itu. Apakah ada cara mudah?
Jawaban:
Ini seharusnya bekerja:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
menjadi %s seconds since the epoch, 1970-01-01 00:00:00 UTC
karena saya melewatkannya di sana.
date
tidak terintegrasi bash
, jadi versi Anda bash
tidak ada hubungannya dengan date
implementasi yang dikirimkan oleh sistem Anda.
date +%s.%N
date +%s%3N
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 date
cukup 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
date
atau karena saya menggunakan zsh
(macOS Catalina) tetapi ini tidak berhasil untuk saya. Menjalankan $ date -d "Oct 21 1973" +%s
outputusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Sejauh ini, semua jawaban menggunakan program eksternal date
.
Sejak Bash 4.2, printf
memiliki pengubah baru %(dateformat)T
yang, ketika digunakan dengan argumen -1
menghasilkan 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 -2
sebagai 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
-2
jika 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 -2
menghindari menyimpan sebuah variabel khusus di awal.
Sejak bash
5.0 ( dirilis pada 7 Jan 2019 ) Anda dapat menggunakan variabel bawaan EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Ada juga EPOCHREALTIME
yang termasuk pecahan detik.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
dapat dikonversi ke mikro-detik (μs) dengan menghapus titik desimal. Ini mungkin menarik ketika menggunakan bash
aritmatika 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.
date +%s%3N
), Anda dapat menggunakanecho $(( ${EPOCHREALTIME/./} / 1000 ))
Dengan sebagian besar implementasi Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
biasanya diunggulkan dengan tanggal / waktu saat ini. Panggilan kedua untuk srand()
mengembalikan nilai yang sebelumnya digunakan sebagai seed.
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 date
akan 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
date
perintah BSD , sedangkan solusi yang disarankan date -d
adalah untuk GNU date
. Tanggal BSD di macOS berasal dari FreeBSD , dan berbagi sejumlah opsi dengan NetBSD dan OpenBSD. Dan ini sepenuhnya terpisah dari bash.
%N
pilihan 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.