Làm cách nào để kiểm tra múi giờ nào trong Linux?


Câu trả lời:


19

Thông thường, TZbiế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()localtime()để chuyển đổi giữa time_tvà biểu diễn múi giờ cục bộ. Đó là, đừng cố gắng tự thực hiện chuyển đổi .


2
Có lệnh nào nói về múi giờ người dùng đang ở không?

26
Chắc chắn, datesẽ cho bạn biết.
Greg Hewgill

Tôi có hai phiên bản của máy chủ, nếu tôi đưa ra lệnh "date" trong cả hai máy chủ thì nó hiển thị thời gian khác nhau. Múi giờ cho cả hai máy chủ là IST, thời gian của một máy chủ: Thứ hai 11 tháng 7 10:39:31 IST 2011 và máy chủ khác Mon Jul 11 ​​10:35:31 IST 2011 .. có sự khác biệt 4 phút

8
Trên chính xác Pangolin echo $TZtrả lại không có gì cho tôi.
Iain Samuel McLean Elder

3
@GregHewgill câu trả lời của bạn không hữu ích ở lần xem đầu tiên. Hãy xem xét chỉnh sửa câu trả lời của bạn. Xem câu trả lời được bình chọn nhiều nhất dưới đây. Tôi sẽ downvote câu trả lời của bạn bây giờ. Ngoài ra không có TZ env mặc định trên máy của tôi.
Therealmarv

244

Nếu bạn có nghĩa là từ bảng điều khiển, chỉ cần gõ:

date +%Z

2
tốt, làm việc tốt
Mặt trăng bạc

15
đây phải là câu trả lời được chấp nhận
KalenGi

điểm tốt ... đã thay đổi câu trả lời cho hiệu ứng đó
Rasman

Và để đặt múi giờ từ dòng lệnh trong Ubuntu, liên kết sau đây cung cấp lệnh 1 dòng đơn giản để làm như vậy: askubfox.com/a/524362/182454
Dan Nissenbaum

Điều này mang lại +07cho tôi. Để truy cập Region/CityLinux dựa trên Debian / Arch, hãy xem câu trả lời này .
Tom Hale

54

Nếu bạn muốn múi giờ số:

date +'%:z %Z'

Đầu ra mẫu:

-05:00 EST

7
Trên OS X, kết quả này:z EST
13/2/2015

7
Điều này nếu cho linux .
Paul Vargas

1
Chính xác hơn, điều này áp dụng cho GNU 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.
Léo Lam

Tuy nhiên, ngày +% z hoạt động tốt trên OS X. Tôi khuyên bạn nên sửa đổi câu trả lời.
Neil Mayhew

1
Xin chào, @NeilMayhew Cảm ơn! Humm ... nhưng câu hỏi có các thẻlinux ubuntu-10.04
Paul Vargas

24

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:

  • / etc / múi giờ (hiện trên Ubuntu và Red Hat? nhưng không phải là Amazon Linux)
  • (trên các hệ thống kiểu Red Hat) như ZONE="US/Eastern"trong / etc / sysconfig / clock
  • hoặ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.


4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
freiheit


6

Đô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 %Zvd US/Eastern. Trên các hệ thống có timedatectlví dụ Fedora, timedatectlxuấ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, timedatectllấy set-timezonenhư 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

4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

Vì vậy, tôi đang trên núi Giờ. Mặc dù lời khuyên ở trên về việc sử dụng biến môi trường hoặc chỉ đầu ra lệnh ngày đôi khi hoạt động tốt hơn, tùy thuộc vào cách bạn muốn sử dụng.



2
  • / etc / sysconfig / clock đặt xem đồng hồ phần cứng được lưu dưới dạng UTC hay giờ địa phương.
  • Symlink / etc / localtime đến / usr / share / zoneinfo / ... để đặt múi giờ của bạn.
  • Nhập /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.


1

Một vài giải pháp:

date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone

đã cho tôi (tương ứng):

UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC

Máy tính của tôi là trên UTC.


0

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ũ).


0

Đôi khi timedatectl set-timezonekhô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/timezonetrỏ 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 .


0

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]'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.