Как синхронизировать дату, время и часовой пояс между планшетом Android и системой Linux?

Я работаю с системой Linux, подключенной к планшету Android. Мне нужно синхронизировать дату, время и часовой пояс. У меня есть программное обеспечение, работающее на обоих, и я хотел бы сопоставить сообщения logcat с планшета Android с сообщениями журнала в системе 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 и учитывать наблюдение этого часового пояса за переходом на летнее время.

На данный момент я создал оператор switch в своем сценарии оболочки, который сопоставляет каждое указанное смещение с регионом/городом. Это проблематично, поскольку некоторые смещения, предоставляемые программным обеспечением в моей системе 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 меняет часовой пояс. Это работает большую часть времени, если только я не выбрал регион/город, который соблюдает (и, оказывается, соблюдает) летнее время, или ни один регион/город не соответствует заданному смещению.

0
0
793
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как правило, часовой пояс в любой системе *nix устанавливается путем создания символической ссылки /etc/localtime на один из файлов zoneinfo в /usr/share/zoneinfo/. Файлы в zoneinfo обычно называются такими вещами, как Европа/Лондон, поэтому команда «readlink /etc/localtime | cut -d/ -f5-», вероятно, даст вам правильное значение часового пояса, если что-то не обрабатывается по-другому в вашей системе. Если это так, вам может потребоваться создать/найти какую-либо утилиту, которая может сопоставить выбранный часовой пояс с ближайшей записью в базе данных zoneinfo.

Спасибо, похоже, моя система по-другому обрабатывает часовой пояс. Ваш ответ помог мне узнать, как это должно быть сделано. Кажется, нет способа установить собственный системный часовой пояс на Android.

Stewball 23.01.2019 21:24

Android работает под управлением ядра Linux, поэтому не должно быть невозможно дублировать информацию о часовом поясе с вашей рабочей станции Linux. Нужно просто выяснить, какие именно параметры он примет для persist.sys.timezone.

Bob Shaffer 23.01.2019 21:40

... или просматривая базу данных zoneinfo, чтобы найти ближайшее совпадение. Я видел несколько систем, где локальное время не является символической ссылкой. Я не уверен, что это преднамеренное изменение, плохо разработанный инструмент для установки часового пояса или что-то еще.

Bob Shaffer 23.01.2019 21:47

Я думал о том же. Однако я не вижу /etc/localtime на своем планшете. Глядя на документацию для AlarmManager, кажется, что они разрешают только часовые пояса Олсона, и я не нашел способа добавить их в список допустимых часовых поясов. В моем приложении я могу создать собственный Часовой пояс с правильным смещением, но я не могу передать этот часовой пояс в AlarmManager. Установка часового пояса по умолчанию не влияет на журналы в logcat.

Stewball 24.01.2019 01:46

похоже, что на моем телефоне Android его тоже нет. Я предполагаю, что, поскольку они являются мобильными устройствами, был исправлен другой метод обработки часовых поясов. Похоже, вам придется вытащить список доступных настроек с планшета, попытаться сопоставить их с вашей собственной базой данных zoneinfo и затем найдите из этого набора тот, который имеет такое же (или близкое) смещение и настройки dst. Или просто продолжайте расширять коммутатор вручную. :)

Bob Shaffer 25.01.2019 01:13

Если вас интересует исключительно совпадение даты и времени (как и я). Вы можете установить часовой пояс планшета на 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

Часовой пояс будет неправильным, но дата и время будут правильными.

Другие вопросы по теме