如何在Android平板电脑和Linux系统之间同步日期,时间和时区?

时间:2019-01-22 22:17:31

标签: android linux shell adb

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

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

adb shell date $(date +%s)

但是,这不会设置TimeZone。

我可以使用此命令获取数字时区

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系统上该软件提供的某些偏移量在找到的here

时区列表中不存在
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系统上的软件更改时区时需要重新启动。除非我选择的某个区域/城市观察(并且恰好正在观察)夏令时,或者没有一个区域/城市与我给出的偏移量相匹配,否则大多数情况下,这都是可行的。

2 个答案:

答案 0 :(得分:0)

通常,通过在/ usr / share / zoneinfo /中的zoneinfo文件之一创建符号链接/ etc / localtime来设置任何* nix系统上的时区。 zoneinfo中的文件通常被命名为Europe / London之类的东西,因此,除非系统上的处理方式有所不同,否则命令“ readlink / etc / localtime | cut -d / -f5-”可能会为您提供正确的时区值。如果是这样,您可能需要制作/查找一些实用程序,该实用程序可以将所选时区与zoneinfo数据库中最接近的条目进行匹配。

答案 1 :(得分:0)

如果您只对日期和时间匹配感兴趣(例如我)。您可以将平板电脑的时区设置为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

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