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
, dash
và posh
gâ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 coreutils
và thay thế date
bằ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