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.
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'
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
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.
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)
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:
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""$@"
Jawaban:
Ini seharusnya bekerja:
sumber
%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 terintegrasibash
, jadi versi Andabash
tidak ada hubungannya dengandate
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).
Konversi jumlah detik kembali ke tanggal
Perintahnya
date
cukup fleksibel. Hal keren lainnya yang dapat Anda lakukan dengan tanggal (tanpa malu disalin daridate --help
). Tunjukkan waktu setempat untuk pukul 09:00 Jumat depan di pantai barat ASLebih baik lagi, luangkan waktu untuk membaca halaman manual http://man7.org/linux/man-pages/man1/date.1.html
sumber
date
atau karena saya menggunakanzsh
(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 olehdateformat
, ditangani olehstrftime(3)
(man 3 strftime
untuk informasi tentang format).Jadi, untuk solusi Bash murni:
atau jika Anda perlu menyimpan hasilnya dalam variabel
var
:Tidak ada program eksternal dan tidak ada subkulit!
Sejak Bash 4.3, bahkan dimungkinkan untuk tidak menentukan
-1
:(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 berlalusumber
-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.Solusi bash murni
Sejak
bash
5.0 ( dirilis pada 7 Jan 2019 ) Anda dapat menggunakan variabel bawaanEPOCHSECONDS
.Ada juga
EPOCHREALTIME
yang termasuk pecahan detik.EPOCHREALTIME
dapat dikonversi ke mikro-detik (μs) dengan menghapus titik desimal. Ini mungkin menarik ketika menggunakanbash
aritmatika bawaan(( expression ))
yang hanya dapat menangani bilangan bulat.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.
sumber
date +%s%3N
), Anda dapat menggunakanecho $(( ${EPOCHREALTIME/./} / 1000 ))
Dengan sebagian besar implementasi Awk:
sumber
srand()
biasanya diunggulkan dengan tanggal / waktu saat ini. Panggilan kedua untuksrand()
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)
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:
Halaman manual Apple untuk implementasi tanggal: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
sumber
date
perintah BSD , sedangkan solusi yang disarankandate -d
adalah untuk GNUdate
. 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 distrftime(3)
halaman manual, yang tidak akan Anda miliki jika Anda belum menginstal Xcode, dan mungkin tidak melihat dengan perintah man bahkan jika Anda melakukannya.gunakan skrip bash ini (saya
~/bin/epoch
):sumber