linux - 使用date命令生成iso-8601格式的时间序列,如何处理服务器系统日期原点偏移?

标签 linux bash date epoch systemtime

我有以下 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/

相关文章:

string - 如何将bash字符串转换为日期?

c++ - 服务器重启后重新连接到 QDBus 服务器(Qt C++)

c++ - Qt C++ 应用程序 : self autostart installation in Linux

bash - 如何在 Notepad++ 6.5.5 上将 unix/bash 设置为默认语言

python - Git Bash 不会运行我的 python 文件?

php - 按 CURRENT_TIMESTAMP 更新日期。为什么全是零?

python - 使用 Python 调整 Gnome

linux - 删除带有特殊字符的文件夹

linux - 从文件中删除特定数据

python - 将日期转换为 CSV 中的特定格式