【问题标题】:How to synchronize date, time and time zone between an android tablet and a Linux system?如何在安卓平板和Linux系统之间同步日期、时间和时区?
【发布时间】:2019-01-22 22:17:30
【问题描述】:

我正在使用连接到 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 语句,它将每个指定的偏移量映射到一个地区/城市。这是有问题的,因为我的 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 系统上的软件更改时区时需要重新启动。这在大多数情况下都有效,除非我选择了一个观察(并且恰好正在观察)夏令时的区域/城市,或者没有区域/城市与我给定的偏移量相匹配。

【问题讨论】:

    标签: android linux shell adb


    【解决方案1】:

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

    【讨论】:

    • 谢谢,看来我的系统确实以不同的方式处理时区。你的回答帮助我知道应该怎么做。似乎没有办法在 android 上设置自定义系统时区。
    • android 运行的是 linux 内核,所以从你的 linux 工作站复制你的时区信息应该不是不可能的。只需弄清楚它将接受persist.sys.timezone 的哪些选项即可。
    • ...或遍历 zoneinfo 数据库以找到最接近的匹配项。我见过一些本地时间不是符号链接的系统。我不确定这是故意更改,设置时区的设计不佳的工具,还是什么。
    • 我也在想同样的事情。不过,我在平板电脑上看不到 /etc/localtime 。查看AlarmManager 的文档,似乎他们只允许奥尔森时区,我还没有找到一种方法来添加到他们的有效时区列表中。在我的应用程序中,我可以创建一个具有正确偏移量的自定义TimeZone,但我无法将该 TimeZone 传递给 AlarmManager。设置默认时区不会影响 logcat 中的日志。
    • 我的安卓手机好像也没有。我猜由于它们是移动设备,因此修补了处理时区的不同方法。听起来您将不得不从平板电脑中提取可用设置列表,尝试将它们与您自己的 zoneinfo db 匹配,并且然后从该集合中找到具有相同(或接近)偏移和 dst 设置的那个。或者只是继续手动扩展您的交换机。 :)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多