Có cách nào để kiểm tra múi giờ tôi hiện đang ở trên Linux không?
Có cách nào để kiểm tra múi giờ tôi hiện đang ở trên Linux không?
Câu trả lời:
Thông thường, TZ
biến môi trường sẽ cho bạn biết một cái gì đó hữu ích. Tuy nhiên, tốt nhất là sử dụng các chức năng như mktime()
và localtime()
để chuyển đổi giữa time_t
và biểu diễn múi giờ cục bộ. Đó là, đừng cố gắng tự thực hiện chuyển đổi .
date
sẽ cho bạn biết.
echo $TZ
trả lại không có gì cho tôi.
Nếu bạn có nghĩa là từ bảng điều khiển, chỉ cần gõ:
date +%Z
+07
cho tôi. Để truy cập Region/City
Linux dựa trên Debian / Arch, hãy xem câu trả lời này .
Nếu bạn muốn múi giờ số:
date +'%:z %Z'
Đầu ra mẫu:
-05:00 EST
:z EST
date
. Phiên bản BusyBox in một cái gì đó không nhạy cảm, "%: z CEST" trong trường hợp của tôi.
linux
ubuntu-10.04
Thay vào đó, tôi muốn tìm múi giờ ở dạng "US / East" hoặc "Europe / London". Bạn có thể tìm thấy điều này trong:
ZONE="US/Eastern"
trong / etc / sysconfig / clockhoặc bạn có thể thử và khớp / etc / localtime với một trong các tệp trong / usr / share / zoneinfo; thật khó chịu đây dường như không phải là một liên kết tượng trưng, nhưng bạn có thể ví dụ
cd / usr / share / areainfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
để tìm các tệp phù hợp - có thể có cách tốt hơn để làm điều đó, nhưng cách đó hiệu quả. Sẽ có nhiều trận đấu.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Đối với Ubuntu hãy thử điều này:
$ cat /etc/timezone
Đầu ra mẫu:
Asia/Kolkata
Đối với các bản phân phối khác Tham khảo: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
không cập nhật/etc/timezone
. Xem câu trả lời này cho một giải pháp dựa trên /etc/localtime
.
Đôi khi bạn có thể tìm kiếm múi giờ chính thay vì dạng ngắn như được sản xuất bởi date %Z
vd US/Eastern
. Trên các hệ thống có timedatectl
ví dụ Fedora, timedatectl
xuất ra nhiều thông tin hữu ích, bao gồm cả khu vực hiện tại:
# 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
Thật không may, timedatectl
lấy set-timezone
như một lệnh, nhưng không có tương ứng get-timezone
. Phân tích nó như sau:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Đối với múi giờ, bạn có thể sử dụng định vị địa lý:
$ curl https://ipapi.co/timezone
America/Chicago
Hoặc là:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
để đặt đồng hồ phần cứng.Nhân Linux luôn lưu trữ và tính thời gian là số giây kể từ nửa đêm của ngày 1 tháng 1 năm 1970 UTC bất kể đồng hồ phần cứng của bạn có được lưu trữ dưới dạng UTC hay không. Chuyển đổi thời gian địa phương của bạn được thực hiện tại thời gian chạy. Một điều thú vị về điều này là nếu ai đó đang sử dụng máy tính của bạn từ một múi giờ khác, họ có thể đặt biến môi trường TZ và tất cả ngày và giờ sẽ xuất hiện chính xác cho múi giờ của họ.
Nếu số giây kể từ ngày 1 tháng 1 năm 1970 UTC được lưu trữ dưới dạng số nguyên 32 bit đã ký (như trên hệ thống Linux / Intel của bạn), đồng hồ của bạn sẽ ngừng hoạt động vào năm 2038. Linux không có vấn đề Y2K vốn có , nhưng nó có một vấn đề năm 2038. Hy vọng rằng tất cả chúng ta sẽ chạy Linux trên các hệ thống 64 bit. Số nguyên 64 bit sẽ giữ cho đồng hồ của chúng tôi chạy khá tốt cho đến tận năm 292271 triệu.
Sử dụng TZ hoặc ngày KHÔNG PHẢI LÀ ĐÁNG TIN CẬY vì nó cho bạn biết múi giờ của NGƯỜI DÙNG chứ không phải múi giờ hệ thống mặc định.
Múi giờ hệ thống mặc định được lưu trữ trong / etc / múi giờ (thường là một liên kết tượng trưng đến tệp dữ liệu múi giờ cụ thể cho múi giờ). Nếu bạn không có / etc / múi giờ, hãy xem / etc / localtime. Nói chung đó là múi giờ của "máy chủ". / etc / localtime thường là một liên kết tượng trưng đến tệp múi giờ trong / usr / share / zoneinfo. Đường dẫn đến tệp múi giờ chính xác thường sẽ cung cấp cho bạn thông tin địa lý.
Linux mới hơn có "timedatectl" cung cấp cho bạn hàng tấn thông tin khi lệnh được chạy.
(với tư cách là nút phụ, nếu bạn có một hệ thống cổ vẫn sử dụng các múi giờ được mã hóa cứng OLD, bạn có thể sao chép tệp múi giờ hiện đại vào nó và nó sẽ hoạt động. Tôi đã phải làm điều này nhiều lần để giải quyết việc thay đổi múi giờ trên thiết bị cũ).
Đôi khi timedatectl set-timezone
không cập nhật/etc/timezone
, vì vậy tốt nhất là lấy tiemzone từ tên của tệp mà symlink /etc/timezone
trỏ tới:
#!/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
Tài liệu tham khảo: trong câu trả lời này .
Bạn có thể hiển thị ngày và múi giờ đồng thời:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'