如何在OS X上使用date命令在任何时区中显示自午夜以来的分钟数



这里是不工作的地方:

> echo $(( ($(date +%s) - $(date +%s -d$(date +%Y-%m-%d))) / 60 ))
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

我也试过了:

> echo $(date +%s -f%Y-%m-%d $(date +%Y-%m-%d))

下面的工作,但只有固定的UTC偏移量,将在标准时间中断:

> echo $[ ( ( $(date "+%s") - 28800 ) % 86400 ) / 60 ]

参考:OS X日期手册

从午夜开始的分钟数(或秒数)可以直接从时间单独计算。

echo $(( $(date "+10#%H * 60 + 10#%M") ))  # Minutes since midnight
echo $(( $(date "+(10#%H * 60 + 10#%M) * 60 + 10#%S") ))  # Seconds since midnight

请注意,这只需要date的最小支持,因此可以与GNU或BSD date一起工作。

这是通过让date输出一个字符串来工作的,这个字符串可以直接传递给shell的算术表达式构造。

感谢Petesh指出需要强制将前导零的数字视为小数

您第一次尝试的问题是您试图将gnu日期选项应用于OSX上的BSD日期。当我试图使脚本在两个平台之间兼容时,这让我遇到了很多问题。

方法之一是:

seconds_now=$(date +%s)
seconds_midnight=$(date -j -f'%Y-%m-%d %H:%M:%S' "$(date +%Y-%m-%d) 00:00:00" +%s)
minutes_now=$(((seconds_now - seconds_midnight) / 60))

您必须使用完整的时间格式,否则日期将占用当前时间的实际小时,分钟和秒,这不是您想要的。

使用date +%z来获取UTC的偏移量,并将其应用于当天午夜过后的分钟数。

offset=$(date +%z) # get TZ offset as [+-]<HH><MM> - for *now*
sign=${offset:0:1} # get sign
hours=${offset:1:2} # get hours
mins=${offset:3:2} # get minutes
minoff=$((10#$hours * 60 + 10#$mins)) # offset in minutes from UTC
from_midnight_utc_mins=$((($(date +%s) % 86400) / 60))
from_midnight_local=$(($from_midnight_utc_mins $sign $minoff))

但是它真的很糟糕。

我对minoff计算中的所有数字使用10#,以防止前导0的两位数字被解释为八进制的情况,这可能会产生错误的计算/错误。

最新更新