Thời gian hiện tại ở Los Angeles là 18:05. Nhưng khi tôi chạy TZ=UTC-8 date --iso=ns
, tôi nhận được:
2013-12-07T10:05:37,788173835+0800
Tiện ích ngày cho tôi biết rằng thời gian là 10:05 và thậm chí nói rằng nó báo cáo là UTC + 8. Tại sao?
Thời gian hiện tại ở Los Angeles là 18:05. Nhưng khi tôi chạy TZ=UTC-8 date --iso=ns
, tôi nhận được:
2013-12-07T10:05:37,788173835+0800
Tiện ích ngày cho tôi biết rằng thời gian là 10:05 và thậm chí nói rằng nó báo cáo là UTC + 8. Tại sao?
Câu trả lời:
Lý do là TZ=UTC-8
được hiểu là múi giờ POSIX . Trong định dạng múi giờ POSIX, 3 chữ cái là chữ viết tắt múi giờ (tùy ý) và số là số giờ múi giờ đứng sau UTC. Vì vậy, UTC-8
có nghĩa là múi giờ viết tắt là "UTC", chậm hơn 8 giờ so với UTC thực, hoặc UTC + 8 giờ.
(Nó hoạt động theo cách đó vì Unix được phát triển ở Hoa Kỳ, đứng sau UTC. Định dạng này cho phép các múi giờ của Hoa Kỳ được thể hiện dưới dạng EST5, CST6, v.v.)
Bạn có thể thấy đó là những gì đang xảy ra bởi những ví dụ này:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
-0800
Định dạng múi giờ ISO có cách tiếp cận ngược lại, với việc -
chỉ ra vùng nằm phía sau UTC và +
cho biết vùng này nằm trước UTC.
TZ=America/Los_Angeles
. Bạn đang quên rằng thời gian Thái Bình Dương là -7 trong thời gian tiết kiệm ánh sáng ban ngày.
TZ=:America/Los_Angeles
. Dấu hai chấm cho biết đó là tệp múi giờ Olson. Và trong một bình luận khác, anh ta đề cập rằng anh ta muốn bỏ qua thời gian tiết kiệm ánh sáng ban ngày, điều đó sẽ không làm được.
EST-5
CST-6
.
Bất cứ khi nào bạn chỉ định múi giờ theo định dạng +/- 00:00, bạn sẽ chỉ định một phần bù , không phải múi giờ thực tế. Từ GNU libc
tài liệu (theo tiêu chuẩn POSIX):
Giá trị bù chỉ định giá trị thời gian bạn phải thêm vào giờ địa phương để nhận giá trị Giờ phối hợp quốc tế. Nó có cú pháp như [+ | -] hh [: mm [: ss]]. Điều này là tích cực nếu múi giờ địa phương ở phía tây của Kinh tuyến gốc và âm nếu là phía đông. Giờ phải nằm trong khoảng từ 0 đến 23, và phút và giây trong khoảng từ 0 đến 59.
Đây là lý do tại sao nó dường như là đảo ngược của những gì bạn mong đợi.
Why?
Bởi vì POSIX yêu cầu nó .
Nếu đứng trước '-', múi giờ sẽ ở phía đông của Kinh tuyến gốc; mặt khác, nó sẽ ở phía tây (có thể được chỉ định bởi một '+' tùy chọn trước).
Vì vậy, điều này sẽ cho thời gian gần [1] Los Angeles
(với bất kỳ nhãn 3 chữ cái nào cho văn bản múi giờ):
$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800
$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800
Và điều này sẽ cho thời gian gần Shanghai, China
hoặc Perth, Australia
:
$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800
$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800
[1] Gần vì có thể có một số DST (Giờ tiết kiệm ánh sáng ban ngày) có hiệu lực làm thay đổi "giờ địa phương" thực tế.
Là một phương pháp thay thế, bạn có thể sử dụng lệnh zdump
để hiển thị thời gian hiện tại trong các múi giờ + offset khác.
Zdump in thời gian hiện tại trong mỗi tên zon có tên trên dòng lệnh.
Các quy tắc tương tự áp dụng với các múi giờ; phía tây của kinh tuyến gốc là "phía sau" trong khi phía đông là "phía trước".
$ zdump PST PST Sat Ngày 7 tháng 12 03:25:27 2013 PST
Tôi đã tạo tập lệnh này để hiển thị một số múi giờ + độ lệch mà chúng tôi quan tâm khi sử dụng zdump
và date
vì vậy chúng tôi có thể so sánh chúng.
$ cat cmd.bash
#!/bin/bash
printf "\ndate: %s\n\n" "$(date)"
for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
echo "-- timezone $tz"
printf "zdump: %s\n" "$(zdump $tz)"
printf "date: %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
echo ""
done
Sau đó, khi bạn chạy nó bạn sẽ nhìn thấy so sánh zdump
với date
:
$ ./cmd.bash
date: Sat Dec 7 02:59:05 EST 2013
-- timezone EST
zdump: EST Sat Dec 7 02:59:05 2013 EST
date: Sat Dec 07 02:59:05 2013 - (EST -0500)
-- timezone PST
zdump: PST Sat Dec 7 07:59:05 2013 PST
date: Sat Dec 07 07:59:05 2013 - (PST +0000)
-- timezone PST+8
zdump: PST+8 Fri Dec 6 23:59:05 2013 PST
date: Fri Dec 06 23:59:05 2013 - (PST -0800)
-- timezone PST-8
zdump: PST-8 Sat Dec 7 15:59:05 2013 PST
date: Sat Dec 07 15:59:05 2013 - (PST +0800)
-- timezone UTC
zdump: UTC Sat Dec 7 07:59:05 2013 UTC
date: Sat Dec 07 07:59:05 2013 - (UTC +0000)
-- timezone UTC+8
zdump: UTC+8 Fri Dec 6 23:59:05 2013 UTC
date: Fri Dec 06 23:59:05 2013 - (UTC -0800)
-- timezone UTC-8
zdump: UTC-8 Sat Dec 7 15:59:05 2013 UTC
date: Sat Dec 07 15:59:05 2013 - (UTC +0800)
TZ=PST+8 date
. Cảm ơn. Tôi cũng tìm thấy lời giải thích này trongman timezone
: "Chuỗi std chỉ định tên của múi giờ và phải có ba ký tự chữ cái trở lên. Chuỗi bù ngay sau std và chỉ định giá trị thời gian được thêm vào giờ địa phương để lấy Giờ quốc tế phối hợp ( UTC). Phần bù là dương nếu múi giờ địa phương ở phía tây của Kinh tuyến gốc và âm nếu là hướng đông. Giờ phải nằm trong khoảng từ 0 đến 24, và phút và giây 0 và 59. "