我有以下 bash 函数,它在运行 ubuntu 的机器上生成 iso-8601 格式的纪元列表,并且工作正常。 (其中 isdate 和 isint bash 函数用于测试输入)
gen_epoch()
{
#@ USAGE: gen_epoch [start_date_iso] [end_date_iso] [increment_in_seconds]
#@
#@ TASK : generate an epoch list (epoch list in isodate format).
#@ result on STDOUT: [epoch_list]
#@ error_code : 2 0
## test argument
if [ "$#" -ne 3 ]; then echo "$FUNCNAME: input error [nb_of_input]"; return 2
elif [ $( isdate $1 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$1]"; return 2
elif [ $( isdate $2 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$2]"; return 2
elif [ $( isint $3 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$3]"; return 2
else local beg=$( TZ=UTC date --date="$1" +%s ); local end=$( TZ=UTC date --date="$2" +%s ); local inc=$3; fi
## generate epoch
while [ $beg -le $end ]
do
local date_out=$( TZ=UTC date --date="UTC 1970-01-01 $beg secs" --iso-8601=seconds ); beg=$(( $beg + $inc ))
echo ${date_out%+*}
done
}
它生成此命令行示例的预期值:
gen_epoch 2014-04-01T00:00:00 2014-04-01T07:00:00 3600
期望值:
2014-04-01T00:00:00
2014-04-01T01:00:00
2014-04-01T02:00:00
2014-04-01T03:00:00
2014-04-01T04:00:00
2014-04-01T05:00:00
2014-04-01T06:00:00
2014-04-01T07:00:00
但是我已经在我没有 root 权限的服务器上尝试了这个功能,我发现了以下结果:
2014-03-31T17:00:00
2014-03-31T18:00:00
2014-03-31T19:00:00
2014-03-31T20:00:00
2014-03-31T21:00:00
2014-03-31T22:00:00
2014-03-31T23:00:00
2014-04-01T00:00:00
而且我看到服务器时间原点不是 1970-01-01T00:00:00。
输入 TZ=UTC date --date="1970-01-01T00:00:00"+%s
命令给出 -25200
的值,对应于 7 小时滞后,而它应该给 0。
我的问题是如何在服务器上纠正这个问题?
假设我不知道我在哪台机器上运行它,那么你能帮我找到一个等效的解决方案吗?所以我知道系统时间是否正确?
最佳答案
不是一个完整的答案,但对于评论来说太长了。
我猜这个特定的服务器在设置时配置不正确。问题是 BIOS 时钟设置为本地时间,而系统认为它是 UTC(或反之亦然)(使用 hwclock
查询硬件时钟设置)。
如果系统配置不正确并且您出于任何原因无法修复它(没有 super 用户帐户或其他任何原因),我建议为您的软件提供“修复时区描述文件并在 TZ 中指定它像这样的变量:TZ=:/path/to/fixing/timezone date --date="1970-01-01T00:00:00"+%s
。显然你必须预先计算哪个TZ 描述文件修复了这个问题并使用了一个合适的。通常可用的时区存储在 /usr/share/zoneinfo
关于linux - 使用date命令生成iso-8601格式的时间序列,如何处理服务器系统日期原点偏移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23304723/