如果目标地区没有使用夏令时,可以日期或时间戳直接减去小时差,也可以使用下面兼容夏令时的方法。

概念:

        时间戳 :从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。是不会随着时区夏令时的改变而改变。(除非你离开地球光速行驶)

        时区 : 由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。正式的时区划分包括24个时区

        夏令时 :一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。

  • 服务器产生的时间戳是不受时区和夏令时影响的,不管是从日期转换还是其他途径获取的,但是转回夏令时日期格式需要函数支持。
  • 从当地的夏令时年月日格式转换的时间戳是否会收夏令时影响,取决于转换函数。

方法

  • 将目标日期转换为时间戳。
  • 将时间戳用新的时区转换回时间,这里需要设置时区名字不然不能自动调整夏令时。

times=$(TZ=Asia/Shanghai date -d @`date +%s` "+%Y-%m-%d %H:%M:%S")
echo $times

注意 :某些国外的服务器可能没有定义Asia/Shanghai时区,不会报错但结果不正确;此时要把上海改成Asia/Hong_Kong

将不同时区时间转换为上海时区的脚本:

#!/bin/sh
#
# Print the specified (or current) time from base time in other time zones
# and the converse
#

# Base time zone from/to which to convert
TZBASE=Asia/Shanghai

# Time zones to display
# See /usr/share/zoneinfo/ for more names
TZONES='UTC America/Los_Angeles America/New_York Europe/London Europe/Paris'

# Display format
FORMAT='%H:%M (%p) %Z %a %m %b %Y'

if [ "$1" ] ; then
  time="$1"
else
  time=`date +%T`
fi

# Show the time from the specified input time zone in the specified output
# time zone
showtime()
{
  TZIN=$1
  TZOUT=$2

  TZ=$TZOUT date --date='TZ="'$TZIN'"'" $time" +"$time $TZIN is $TZOUT $FORMAT"
}

for tz in $TZONES ; do
  showtime $TZBASE $tz
done

echo

Logo

更多推荐