Neden TZ = UTC-8 UTC + 8 olan tarihler üretiyor?


25

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:


33

Bunun nedeni TZ=UTC-8bir 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 -0800zaman dilimi formatı zıt yaklaşımı benimsemiştir .-+


Ah, gerçekten istediğim buydu TZ=PST+8 date. Teşekkürler. Ayrıca şu açıklamayı da buldum man 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.
Alex Henrie,

3
@Alex hayır, gerçekten istediğiniz şey TZ=America/Los_Angeles. Pasifik zamanının gün ışığından yararlanma saati boyunca -7 olduğunu unutuyorsunuz.
Matt Johnson-Pint

3
@MattJohnson demek istiyorsun 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.
cjm

@cjm, Teşekkürler, kolon konusunda haklısınız ve bu yorumu görmedim.
Matt Johnson-Pint

Amerika, olmamız gerektiği anlamına gelirse, dünyaya EST-5 CST-6.
Evan Carroll

7

+/- 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.


2

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, Chinaya 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.


1

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.

Örnek

$ 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 zdumpve datebö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 zdumpiç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)

Aslında şu anki saati Pasifik Standart Saati’nde, Gün Işığından Tasarrufları görmezden gelmeye çalışıyorum.
Alex Henrie,

1
Bunu reddetmek zorunda kaldım çünkü "UTC-8" in yanlış olduğunu tahmin ediyorsun. Doğru, sadece kullanıcının beklediği şeyi yapmıyor. Neden bu şekilde çalıştığına dair soruyu yanıtladığını sanmıyorum.
Ürdün

@jordanm - temizliği görün.
slm

1
Hala neler olduğunu açıklıyor, ancak neden OP sorduğu sorusunu “neden” ve “neden” olarak açıklamıyor. Olumsuz oyumu kaldıracağım ama hala sorunun iyi bir cevabı olduğunu sanmıyorum.
Ürdün
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.