如何在安卓平板电脑和Linux系统之间同步日期、时间和时区



我正在使用一个连接到Android平板电脑的Linux系统。我需要同步日期、时间和时区。我在这两个平台上都运行了软件,我想将Android平板电脑上的logcat消息与Linux系统上的日志消息关联起来。两者都包含一个时间戳。

我发现我可以使用此命令同步日期和时间。

adb shell date $(date +%s)

但是,这不会设置时区。

我可以使用这个命令获得一个数字时区

date +%z

我的Linux系统上的软件使用UTC偏移列表(UTC-0700、UTC+0700等)和一个复选框来设置此偏移,该复选框指示是否观察到夏令时。如果是,偏移量将增加一小时。

更新:我的linux系统上的软件编译自己的/etc/localtime文件,其中包含UTC偏移量和一些二进制数据。

$ ll /etc/localtime
-rw-r--r--. 1 root root 120 Jan 18 14:06 /etc/localtime
$ date
Wed Jan 23 13:05:37 -07 2019

Android需要一个地区/城市。

adb shell setprop persist.sys.timezone "America/Denver"

如果我理解正确,这允许android设置UTC偏移量,并考虑该时区对夏令时的观测。

目前,我已经在shell脚本中创建了一个switch语句,它将每个指定的偏移量映射到一个Region/City。这是有问题的,因为我的linux系统上的软件提供的一些偏移不存在于的时区列表中

adb shell date $(date +%s)
timeZoneOffset=`date +%z`
case "$timeZoneOffset" in
+1400)
timeZone="Pacific/Kiritimati"
;;
...
-1200)
timeZone="Etc/GMT+12"
;;
*)
timeZone="Europe/London"
;;
esac
adb shell setprop persist.sys.timezone $timeZone

此脚本在启动时运行,当Linux系统上的软件更改时区时需要重新启动。除非我选择了一个观察(并且碰巧正在观察)夏令时的地区/城市,或者没有一个地区/城市与我给定的偏移量相匹配,否则大多数情况下都是这样。

通常,任何*nix系统上的时区都是通过在/usr/share/zoneinfo/中创建一个指向其中一个zoneinfo文件的符号链接/etc/localtime来设置的。zoneinfo中的文件通常被命名为类似欧洲/伦敦的名称,因此命令"readlink/etc/localtime|cut-d/-f5-"可能会为您提供正确的时区值,除非您的系统中有不同的处理方式。如果是这种情况,您可能需要制作/找到一些实用程序,以便将所选时区与zoneinfo数据库中最近的条目相匹配。

如果你只对日期和时间匹配感兴趣(就像我一样)。您可以将平板电脑的时区设置为Etc/GMT,然后像这样手动应用UTC偏移。

adb shell setprop persist.sys.timezone "Etc/GMT"
tz=`date +%z`
sign=${tz:0:1}
hours=${tz:1:2}
minutes=${tz:3:2}
(( offset = (3600 * hours) + (60 * minutes) ))
t=`date +%s`
if [ $sign == "-"]
then
(( t = t - offset ))
else
(( t = t + offset ))
fi
adb shell date $t

时区是错误的,但日期和时间是正确的。

最新更新