Los Angeles'taki saat 18:05. Ama kaçtığımda şunu alıyorum TZ=UTC-8 date --iso=ns
:
2013-12-07T10:05:37,788173835+0800
Date programı bana saatin 10:05 olduğunu ve hatta UTC + 8 olarak bildirdiğini söylüyor. Niye ya?
Los Angeles'taki saat 18:05. Ama kaçtığımda şunu alıyorum TZ=UTC-8 date --iso=ns
:
2013-12-07T10:05:37,788173835+0800
Date programı bana saatin 10:05 olduğunu ve hatta UTC + 8 olarak bildirdiğini söylüyor. Niye ya?
Yanıtlar:
Bunun nedeni TZ=UTC-8
bir POSIX zaman dilimi olarak yorumlanmasıdır . POSIX saat dilimi biçiminde, 3 harf, saat dilimi kısaltmasıdır (rastgele) ve sayı, saat diliminin UTC'nin arkasında kaldığı saat sayısıdır . Yani UTC-8
, gerçek UTC'nin UT8 saat veya UTC + 8 saatin arkasında 8 saat olan "UTC" kısaltılmış bir saat dilimi anlamına gelir.
(Unix, UTC'nin arkasındaki ABD'de geliştirildiği için bu şekilde çalışır. Bu biçim, ABD'nin saat dilimlerinin EST5, CST6 vb. Olarak gösterilmesini sağlar.)
Bu örneklerde neler olduğunu görebiliyorsunuz:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
Bölgenin UTC'nin arkasında olduğunu ve bölgenin UTC'nin önünde olduğunu gösteren ISO -0800
zaman dilimi formatı zıt yaklaşımı benimsemiştir .-
+
TZ=America/Los_Angeles
. Pasifik zamanının gün ışığından yararlanma saati boyunca -7 olduğunu unutuyorsunuz.
TZ=:America/Los_Angeles
. Kolon, bir Olson zaman dilimi dosyası olduğunu gösterir. Ve bir başka yorumda, bunun işe yaramayacağı gün ışığından yararlanma zamanını görmezden gelmek istediğini belirtti.
EST-5
CST-6
.
+/- 00:00 biçiminde bir saat dilimi belirlediğinizde , gerçek saat dilimini değil, bir ofset belirtiyorsunuz. Gönderen GNU libc
belgelerinde (POSIX standardını izler):
Ofset, Eşgüdümlü bir Evrensel Saat değeri elde etmek için yerel saate eklemeniz gereken zaman değerini belirtir. [+ | -] hh [: mm [: ss]] gibi bir sözdizimine sahiptir. Yerel saat dilimi Başbakan Meridian bölgesinin batısındaysa bu, doğuda ise negatiftir. Saat 0 ile 23 arasında ve dakika ile saniye 0 ile 59 arasında olmalıdır.
Bu yüzden beklediğinizin tersi gibi görünüyor.
Why?
Çünkü POSIX gerektiriyor .
Öncesinde '-' yazıyorsa, saat dilimi Başbakan Meridian'ın doğusunda olacaktır; Aksi takdirde, batı olmalıdır (isteğe bağlı bir '+' ile belirtilebilir).
Bu, [1] 'e yakın zaman verecektir Los Angeles
(zaman dilimi metni için herhangi bir 3 harf etiketi ile):
$ 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
Ve bu Shanghai, China
ya da yakın zaman vermelidir 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] Yakınında çünkü gerçek "yerel saati" değiştiren bazı DST (Günışığı Tasarrufu Zamanı) olabilir.
Alternatif bir yöntem olarak zdump
, geçerli saati diğer zaman dilimleri + ofsetlerde göstermek için komutu kullanabilirsiniz .
Zdump, komut satırında belirtilen her alan adındaki geçerli saati yazdırır.
Aynı kurallar saat dilimleri için de geçerlidir; asıl meridyenin batısında "arkada", doğuda "ileride" yer almaktadır.
$ zdump PST PST Sat Aralık 7 03:25:27 2013 PST
Bu senaryoyu, kullanmak istediğimiz birkaç zaman dilimi + ofsetini göstermek için yaptım zdump
ve date
böylece karşılaştırabiliriz.
$ 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
Bunu çalıştırdığınızda Sonra karşılaştırmasını görebilirsiniz zdump
için 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
. Teşekkürler. Ayrıca şu açıklamayı da buldumman timezone
: "std string, zaman diliminin adını belirtir ve üç veya daha fazla alfabetik karakterden oluşmalıdır. Ofset dizgisi hemen std'yi izler ve Koordineli Evrensel Saat almak için yerel saate eklenecek zaman değerini belirtir (( UTC). Yerel zaman dilimi Prime Meridian’ın batısındaysa ofset pozitif, doğu ise negatif.