Câu trả lời:
Để tránh điều kiện chủng tộc, vẫn giả sử ngày GNU:
eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"
Với zsh, bạn có thể làm điều đó trong nội bộ:
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))
Có thể, trong các múi giờ không có công tắc tiết kiệm ánh sáng ban ngày, bạn có thể làm:
IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"
Đây ${X#0}là loại bỏ các số 0 đứng đầu mà trong một số shell như thế bash, dashvà poshgây ra vấn đề với 09(trong đó shell phàn nàn về việc nó là một số bát phân không hợp lệ).
IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
Không cần bất kỳ biểu thức số học nào, chỉ cần sử dụng ngày thuần túy:
date -d "1970-01-01 UTC $(date +%T)" +%s
brew install coreutilsvà thay thế datebằnggdate
Dựa trên bash, nhận thời gian hiện tại tính bằng mili giây kể từ nửa đêm , trên hệ thống GNU, có thể được thực hiện như sau:
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
date -d @$seconds