Apakah ada cara untuk memeriksa zona waktu saya saat ini di Linux?
Apakah ada cara untuk memeriksa zona waktu saya saat ini di Linux?
Jawaban:
Biasanya, TZ
variabel lingkungan akan memberi tahu Anda sesuatu yang bermanfaat. Namun, yang terbaik adalah menggunakan fungsi seperti mktime()
dan localtime()
untuk mengkonversi antara time_t
dan representasi zona waktu lokal. Artinya, jangan mencoba melakukan konversi sendiri .
date
akan memberitahumu.
echo $TZ
tidak mengembalikan apa pun untuk saya.
Jika Anda maksud dari konsol, ketikkan:
date +%Z
Jika Anda ingin zona waktu numerik:
date +'%:z %Z'
Output sampel:
-05:00 EST
:z EST
date
. Versi BusyBox mencetak sesuatu yang tidak masuk akal, "%: z CEST" dalam kasus saya.
linux
ubuntu-10.04
Saya ingin mencari zona waktu dalam bentuk "AS / Timur" atau "Eropa / London". Anda dapat menemukannya di:
ZONE="US/Eastern"
di / etc / sysconfig / clockatau Anda dapat mencoba dan mencocokkan / etc / localtime dengan salah satu file di bawah / usr / share / zoneinfo; menjengkelkan ini tampaknya tidak menjadi symlink, tetapi Anda bisa misalnya
cd / usr / share / zoneinfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
untuk menemukan file yang cocok - mungkin ada cara yang lebih baik untuk melakukannya, tetapi itu berhasil. Akan ada beberapa pertandingan.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Untuk ubuntu coba ini:
$ cat /etc/timezone
Output sampel:
Asia/Kolkata
Untuk Referensi distro lainnya: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
tidak diperbarui/etc/timezone
. Lihat jawaban ini untuk solusi berdasarkan /etc/localtime
.
Kadang-kadang Anda mungkin mencari zona waktu kanonik daripada bentuk pendek seperti yang diproduksi oleh date %Z
mis US/Eastern
. Pada sistem dengan timedatectl
eg Fedora, timedatectl
mengeluarkan banyak informasi berguna, termasuk zona saat ini:
# timedatectl
Local time: Tue 2016-09-13 17:10:26 EDT
Universal time: Tue 2016-09-13 21:10:26 UTC
RTC time: Tue 2016-09-13 21:10:26
Time zone: US/Eastern (EDT, -0400)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
Sayangnya, timedatectl
mengambil set-timezone
sebagai perintah, tetapi tidak memiliki yang sesuai get-timezone
. Pisahkan sebagai berikut:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Untuk zona waktu, Anda dapat menggunakan geolokasi:
$ curl https://ipapi.co/timezone
America/Chicago
Atau:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
untuk mengatur jam perangkat keras.Kernel Linux selalu menyimpan dan menghitung waktu sebagai jumlah detik sejak tengah malam tanggal 1 Januari 1970 UTC terlepas dari apakah jam perangkat keras Anda disimpan sebagai UTC atau tidak. Konversi ke waktu lokal Anda dilakukan pada saat run-time. Satu hal yang rapi tentang ini adalah bahwa jika seseorang menggunakan komputer Anda dari zona waktu yang berbeda, mereka dapat mengatur variabel lingkungan TZ dan semua tanggal dan waktu akan tampak benar untuk zona waktu mereka.
Jika jumlah detik sejak 1 Januari 1970 UTC disimpan sebagai bilangan bulat 32-bit yang ditandatangani (seperti pada sistem Linux / Intel Anda), jam Anda akan berhenti berfungsi pada suatu waktu di tahun 2038. Linux tidak memiliki masalah Y2K yang melekat , tetapi memiliki masalah tahun 2038. Semoga kita semua akan menjalankan Linux pada sistem 64-bit saat itu. Bilangan bulat 64-bit akan membuat jam kami berjalan dengan sangat baik hingga sekitar tahun 292271-juta.
Menggunakan TZ atau tanggal TIDAK DAPAT DIANDALKAN karena ini memberi tahu Anda zona waktu USER, bukan zona waktu sistem default.
Zona waktu sistem default disimpan di / etc / timezone (yang sering merupakan tautan simbolis ke file data zona waktu khusus untuk zona waktu). Jika Anda tidak memiliki / etc / zona waktu, lihat / etc / localtime. Umumnya itu adalah zona waktu "server". / etc / localtime seringkali merupakan symlink ke file zona waktu di / usr / share / zoneinfo. Jalur ke file zona waktu yang benar akan sering memberi Anda informasi geografi juga.
Linux yang lebih baru memiliki "timedatectl" yang memberi Anda banyak info ketika perintah dijalankan.
(sebagai simpul samping, jika Anda memiliki sistem kuno yang masih menggunakan zona waktu hard-coded LAMA, Anda mungkin dapat menyalin file zona waktu modern ke dalamnya dan itu akan berfungsi. Saya harus melakukan ini berkali-kali untuk menyelesaikan perubahan zona waktu. pada peralatan yang lebih tua).
Terkadang timedatectl set-timezone
tidak diperbarui/etc/timezone
, jadi yang terbaik adalah mendapatkan tiemzone dari nama file yang /etc/timezone
ditunjuk symlink :
#!/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
Referensi: dalam jawaban ini .
Anda dapat menampilkan tanggal dan zona waktu secara bersamaan:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'