Farklı bir saat diliminden saat tarihini nasıl çıkarabilirim?


115

Saat dilimi ayarlanmış olarak çalışan bir sunucum var UTC. Genelde iyi bir uygulama gibi görünüyordu (lütfen yanılıyorsam beni düzeltin).

Her neyse, bağlanabildiğim sunuculardan biri, scpdosyalar için çalışıyor EDTve kopyalamam gereken dosyaları saklıyor/path/to/filename/data20120913

Ben çalışıyorum baktım rsyncBul'un gibi bir şey kullanarak dosyaları -mtime -1son gün değiştirilen dosyalar için bayrak, ama hiçbir şansım yoktu.

scpŞu anki günün dosyasını kopyalamak için kullanmıyorum , ama şu andan itibaren date +%Y%m%d, çalışanların her sunucuda farklı bir gün vereceği ve beni biraz rahatsız eden 4 saatlik bir pencere var .

Bakarak man datezaman çıktısına sahip olabileceğimi görüyorum UTC, ancak çıktı gibi başka bir zaman dilimi çıktısı görmenin bir yolunu görmüyorum.EDT

Sanırım , o zamandan itibaren saniye cinsinden tarihi almak, ikinci bir manuel hesaplama yapmak ve bunu tarih olarak göstermek hakkında da bir şeyler görmek için GNUtarih uzatma gibi bir şey kullanabileceğimi düşünüyorum. .date -d 20100909 +%s4 * 60 * 60

Tarihi , ayarlanmış bir sunucuda YYYYMMDDformatta basmanın daha basit bir yolu var mı ?EDTUTC


EDT tanınmış bir saat dilimi değildir - en azından Linux'ta. "Dikkatli ol!" tüm çirkin hikaye için aşağıda cevap. Eğer EDT markanızda * NIX tanınırsa, yine de dikkatli olmalısınız ve saat diliminizi kontrol ediniz.
Mike S

Yanıtlar:


175

Sorgu süresi için bir saat dilimi belirleyebilirsiniz.

TZ=America/New_York date

TZAyar ve datekomut arasındaki boşluklara dikkat edin . Bourne benzeri ve rcbenzeri kabuğunda, TZyalnızca komut satırı için değişken ayarlar . Diğer kabukları (In csh, tcsh, fish), her zaman kullanabilirsiniz envyerine komutu:

env TZ=America/New_York date

tl; Dr.

Linux sistemlerinde. saat dilimleri /usr/share/zoneinfodizindeki dosyalarda tanımlanır . Bu yapı genellikle kurucu katkısını onurlandırmak için "Olson veritabanı" olarak adlandırılır.

Her bir saat dilimi için kurallar, daha sonra bir ikili dosya halinde derlenen metin dosyası satırları olarak tanımlanır. Bu şekilde derlenen satırlar bölge adını tanımlar; bölgenin uygulandığı bir dizi veri ve zaman; standart süre için UTC'den bir ofset; ve eğer varsa, gün ışığından yararlanma zamanına geçişin nasıl gerçekleştiğini tanımlamak için kullanılan not.

Örneğin, "Amerika" dizini America/New_Yorkyukarıda kullanılan dosyada New York için gerekli bilgileri içerir .

Varolmayan bir bölgenin (dosya adı) belirtilmesinin sessizce göz ardı edildiğine ve UTC zamanlarının bildirildiğine dikkat edin. Örneğin, bu yanlış bir zaman raporlar:

TZ="America/New York" date ### WRONG ###

SUSv3 veya POSIX-2001 olarak bilinen Tek UNIX Özelliği, sürüm-3, taşınabilirlik için, saat dilimi açıklamasını tanımlayan karakter dizesinin iki nokta karakteriyle başlaması gerektiğini not eder. Böylece şunu da yazabiliriz:

TZ=":America/New_York" date
TZ=":America/Los_Angeles" date

SUSv3, bir açıklama dosyasına yol adı kullanarak zaman dilimlerinin belirtilmesine alternatif bir yöntem olarak, POSIX modelini açıklar. Bu formatta, bir dize şöyle tanımlanır:

std offset [dst[offset][,start-date[/time],end-date[/time]]]

stdstandart bileşen adı nerede ve dstgün ışığından yararlanma nerededir. Her isim üç veya daha fazla karakterden oluşur. offsetMeridyen olanlar doğu için ilk meridyenin batısında saat dilimleri için pozitif ve negatif. Ofset UTC'yi (daha önce GMT olarak bilinen) elde etmek için yerel saate eklenir. startVe endstandart / günışığı geçişler meydana geldiğinde zaman alanları göstermektedir.

Örneğin, Doğu Amerika Birleşik Devletleri'nde standart saat UTC'den 5 saat öncedir ve bunun EST5EDTyerine belirtebiliriz America/New_York. Bununla birlikte, bu alternatifler her zaman tanınmaz, özellikle de Amerika Birleşik Devletleri dışındaki bölgeler için ve en iyi şekilde kaçınılması gerekir.

HP-UX (SUSv3 uyumlu bir UNIX), /usr/lib/tztabEST5EDT, CST6CDT, MST7MDT, PST8PDT gibi metin kurallarını ve POSIX adlarını kullanır. Dosya, Olson veritabanına benzer şekilde, her bir zaman dilimi için tüm tarihsel kuralları içerir.

NOT: Eğer şu dizin inceleyerek saat dilimleri tüm bulmak mümkün olmalıdır: /usr/share/zoneinfo.


emin yanlış benim ama eğer exportdaha iyi görünüyor envkomuta
INSIGN

@JRFerguson - Listeye bir saat dilimi dahil edilmemişse, örneğin Las Vegas veya Nevada, zamanı doğrulamanın alternatifleri nelerdir?
Motive,

@Motivasyon Şehriniz veya eyaletiniz dahil edilmemişse, sizinkiyle aynı bölge bilgisini kullanan birini seçin. Örneğin, ben New York'la aynı saat dilimini kullanan Florida'dayım, bu yüzden makinelerim New York saatiyle senkronize oluyor.
JRFerguson

1
@JRFerguson - Kişinin çeşitli zaman dilimlerinden haberdar olduğunu ve sizin durumunuzda alternatif bir örneğin New York kullanabileceğini varsayar. Tek seçenek bu mu olurdu? Örneğin, Avrupa'da yaşamıyorum ve üst üste binen saat dilimlerini bilmiyorum.
Motive etti

1
@Motive Bölgenizdeki diğer noktaları bulmanıza yardımcı olmak için bu site gibi bir şey kullanabilirsiniz .
JRFerguson

33

Bunu TZortam değişkenini değiştirerek yapabilirsiniz . Aşağıdakiler, ABD / Doğu için yerel zamanı size verir; bu, DST ile başa çıkmak için yeterince akıllıca olacaktır:

# all on one line
TZ=":US/Eastern" date +%Y%m%d

Bölge adı, içindeki dosya ve dizinlerden gelir /usr/share/zoneinfo.


17

Dikkatli ol! Tarih, tanımadığı bir saat dilimini verirseniz CURRENT saat diliminizdeki saati mutlu bir şekilde gösterir.

Şuna bir bak:

-bash-4.2$ env TZ=EDT date
Wed Feb 18 19:34:41 EDT 2015
-bash-4.2$ date
Wed Feb 18 19:34:43 UTC 2015

EDT adında bir saat dilimi olmadığını unutmayın. Doğrusu,

-bash-4.2$ find /usr/share/zoneinfo -name "*EDT*"

döner

/usr/share/zoneinfo/EST5EDT
/usr/share/zoneinfo/posix/EST5EDT
/usr/share/zoneinfo/right/EST5EDT

Ve bu çalışır:

-bash-4.2$ TZ=EST5EDT date
Wed Feb 18 14:36:59 EST 2015
-bash-4.2$ date
Wed Feb 18 19:37:01 UTC 2015

Bununla birlikte, arkadaşınız Gobbledygook'un mistik ülkesinde yaşıyorsa ve bölge bilgisi kendi bilgilerinizle çakışıyorsa, Gobbledygook bölgesindeki saatin tarihini çıkartabilirsiniz ve bunu size bildirmek için nary bir çıkış değeriyle yapmaktan mutluluk duyacaksınız. bölge tarafından bilinmiyor:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0

YMMV: MacOS / BSD kutumda hatalı biçimlendirilmiş TZdize UTC zamanını döndürüyor.
Mark Hudson,

8
TODAY=$(TZ=":US/Eastern" date)
echo $TODAY

6

Tarih sözdizimi bir komut satırı çağırma bir ağrı yapar gizli ve hataya açık olduğunu. Bu nedenle , başka bir zaman diliminde ve sohbette belirli bir zaman diliminden (yerel dilinizi ) belirtilen (veya mevcut) zamanı yazdıracak küçük bir senaryo yazdım ( dünya adını verdim ).

İşte burada. Gereksinimlerinize uyacak şekilde ayarlayın, yolunuza koyun ve yürütülebilir duruma getirin.

#! / Bin / sh
#
# Belirtilen (veya mevcut) süreyi diğer zaman dilimlerinde baz zamandan itibaren yazdır
# ve sohbet
#

# Dönüştürmek için / arasında baz saat dilimi
TZBASE = Avrupa / Atina

# Görüntülenecek zaman dilimleri
# Daha fazla isim için / usr / share / zoneinfo / 'ya bakınız.
TZONES = 'UTC Amerika / Los_Angeles Amerika / New_York Avrupa / Londra Avrupa / Paris'

# Oynatma formatı
FORMAT = '% H:% M (% p)% Z% a% m% b% Y'

eğer ["$ 1"]; sonra
  Zaman = "$ 1"
Başka
  saat = `tarih +% T`
fi

# Belirtilen çıktıdaki belirtilen giriş zaman diliminden gelen zamanı gösterin
# saat dilimi
gösteri zamanı()
{
  Tzin = $ 1
  TZOUT = $ 2

  TZ = $ TZOUT tarihi - tarih = 'TZ = "' $ TZIN '"' "$ zaman" + "$ zaman $ TZIN, $ TZOUT $ FORMAT"
}

$ TZONES içindeki tz için; yap
  şov zamanı $ TZBASE $ tz
tamam

Eko

$ TZONES içindeki tz için; yap
  şov zamanı $ tz $ TZBASE
tamam


3

Genellikle yerel saat diliminde zaman damgası bulunur ve bunu uzak tz'ye dönüştürmeniz gerekir. İle yapılabilir:

TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'

nerede:

America/Curacao - remote timezone
MSK - local timezone
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.