Obtenha o fuso horário atual como 'Região / Cidade'

3

Infelizmente, timedatectl set-timezone não atualiza /etc/timezone .

Como faço para obter o fuso horário atual como Region/City , por exemplo:

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

Eu posso pegar a última parte:

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

Como obtenho a parte Asia/Kuala_Lumpur sem obter todos os awk -ward?

Estou no Linux, mas existe também uma maneira POSIX?

    
por Tom Hale 25.06.2018 / 11:12

2 respostas

2

Para o fuso horário, você pode usar a geolocalização:

$ curl https://ipapi.co/timezone
America/Chicago

Ou:

$ curl http://ip-api.com/line?fields=timezone
America/Chicago

link

    
por 29.07.2018 / 02:40
1

Em este comentário de Stéphane Chazelas , ele disse:

timedatectl is a systemd thing that queries timedated over dbus and timedated derives the name of the timezone (like Europe/London) by doing a readlink() on /etc/localtime. If /etc/localtime is not a symlink, then that name cannot be derived as those timezone definition files don't contain that information.

Com base nisso e no comentário da tonioc , eu coloquei juntos o seguinte:

#!/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
    # https://stackoverflow.com/questions/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
    
por 26.06.2018 / 08:44