Bagaimana saya menemukan detik sejak tengah malam?

11

Dengan menggunakan dateprogram ini, bagaimana saya bisa menghitung jumlah detik sejak tengah malam?

Ducky
sumber
1
tanggal "+ (% H * 60 +% M) * 60 +% S" | bc
groxxda
1
echo $ (($ (tanggal '+ (% H * 60 +% M) * 60 +% S')))
groxxda

Jawaban:

14

Untuk menghindari kondisi balapan, masih dengan asumsi tanggal GNU:

eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"

Dengan zsh, Anda dapat melakukannya secara internal:

zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))

Mudah dibawa, di zona waktu di mana tidak ada sakelar hemat siang hari, Anda bisa melakukan:

IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"

The ${X#0}adalah untuk melucuti 0s terkemuka yang dalam beberapa kerang seperti bash, dashdan poshmenyebabkan masalah dengan 09(di mana shell mengeluh tentang hal itu menjadi bilangan oktal valid).

Stéphane Chazelas
sumber
Penggunaan sangat pintar dan baik eval
Ulrich Dangel
Saya lebih suka menggunakan sesuatu di sepanjang baris ini:IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
x-yuri
7

Tidak perlu untuk ekspresi aritmatika, cukup gunakan tanggal murni:

date -d "1970-01-01 UTC $(date +%T)" +%s
Ipor Sircer
sumber
Jawaban yang bagus, harus menjadi yang teratas.
Leopoldo Sanczyk
1
Di Mac brew install coreutilsdan ganti datedengangdate
Connor McCormick
2

Berdasarkan bash, dapatkan waktu saat ini dalam milidetik sejak tengah malam , pada sistem GNU, dapat dilakukan seperti ini:

$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
fedorqui
sumber
2
Anda ingin memastikan bahwa Anda tidak melakukannya pada 23:59:59
Stéphane Chazelas
Dan untuk mengkonversi kembali:date -d @$seconds
choroba