Holen Sie sich die aktuelle Zeitzone als "Region / Stadt"

8

Wird leider timedatectl set-timezonenicht aktualisiert/etc/timezone .

Wie erhalte ich die aktuelle Zeitzone wie folgt Region/City:

% timedatectl | grep zone
                       Time zone: Asia/Kuala_Lumpur (+08, +0800)

Ich kann den letzten Teil bekommen:

% date +"%Z %z"
+08 +0800

Wie bekomme ich das Asia/Kuala_LumpurTeil, ohne alles zu awkbekommen?

Ich bin unter Linux, aber gibt es auch einen POSIX-Weg?

Tom Hale
quelle
1
Haben Sie nicht / etc / localtime als symbolischen Link zur zoneinfo-Datei? (zB / etc / localtime -> ../usr/share/zoneinfo/Europe/Madrid) In einem solchen Fall können Sie dies über readlink / etc / localtime | erhalten sed "s [. * zoneinfo / [["
tonioc

Antworten:

3

In diesem Kommentar von Stéphane Chazelas sagte er:

timedatectlist eine systemdSache , die Abfragen timedatedüber dbusund timedatedleitet den Namen der Zeitzone (wie Europe/London) durch ein Tun readlink()auf /etc/localtime. Wenn /etc/localtimees sich nicht um einen Symlink handelt, kann dieser Name nicht abgeleitet werden, da diese Zeitzonendefinitionsdateien diese Informationen nicht enthalten.

Basierend auf diesem und Toniocs Kommentar habe ich Folgendes zusammengestellt:

#!/bin/bash
set -euo pipefail

if filename=$(readlink /etc/localtime); then
    # /etc/localtime is a symlink as expected
    timezone=${filename#*zoneinfo/}
    if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
        # not pointing to expected location or not Region/City
        >&2 echo "$filename points to an unexpected location"
        exit 1
    fi
    echo "$timezone"
else  # compare files by contents
    # /programming/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
    find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
        cmp -s {} /etc/localtime \; -print | sed -e 's@.*/zoneinfo/@@' | head -n1
fi
Tom Hale
quelle
1
Sie haben ein gutes Auge , danke für das Update, @StephenKitt.
Tom Hale