Привет, ЛОР.
А ты замечал, что в современных телефонах, будь то Android или iOS, после перелёта в другой часовой пояс – часы автоматически синхронизируются по времени местной сети?
Как известно, во всех современных ноутбуках, пригодных к использованию (это Fujitsu, Lenovo ThinkPad и некоторые Dell/HP) – есть LTE модем.
Почему бы нам не использовать его для определения часового пояса после пробуждения ноутбука?
Простой скрипт:
#!/bin/bash
# Minimal script to set system clock from ModemManager using machine-readable output
# Get first modem (extract the number from the path)
MODEM_NUM=$(mmcli --list-modems -K | grep "^modem-list.value\[" | head -1 | cut -d':' -f2 | xargs | grep -o '[0-9]*$')
if [ -z "$MODEM_NUM" ]; then
echo "Error: No modem found"
exit 1
fi
echo "Using modem $MODEM_NUM"
# Get time info in machine-readable format
TIME_OUTPUT=$(mmcli -m "$MODEM_NUM" --time -K)
# Extract modem time and timezone offset
MODEM_TIME=$(echo "$TIME_OUTPUT" | grep "^modem.time.current" | cut -d':' -f2- | xargs)
TIMEZONE_OFFSET=$(echo "$TIME_OUTPUT" | grep "^modem.timezone.current" | cut -d':' -f2- | xargs)
echo "Modem time: $MODEM_TIME"
echo "Timezone offset: $TIMEZONE_OFFSET minutes"
# Check if we got valid data
if [ -z "$MODEM_TIME" ]; then
echo "Error: Could not retrieve modem time"
exit 1
fi
# Set system time using the modem's timestamp (which includes timezone info)
sudo date -s "$MODEM_TIME"
# Calculate hours and minutes from offset
if [ -n "$TIMEZONE_OFFSET" ]; then
HOURS=$((TIMEZONE_OFFSET / 60))
MINUTES=$((TIMEZONE_OFFSET % 60))
# Format as +HH:MM or -HH:MM
if [ $TIMEZONE_OFFSET -ge 0 ]; then
TZ_STRING=$(printf "Etc/GMT%+d" $((-HOURS)))
else
TZ_STRING=$(printf "Etc/GMT%+d" $((-HOURS)))
fi
sudo timedatectl set-timezone "$TZ_STRING"
echo "System clock synchronized to $TZ_STRING (offset $TIMEZONE_OFFSET minutes)"
else
echo "System clock synchronized (timezone unchanged)"
fi
можно положить в /lib/systemd/system-sleep/ или в любые другие хуки – по вашему желанию.







