2011-07-23 11 views
6

Belirli bir bankada dünyanın tüm büyük şehirlerinde şubeleri vardır. Hepsi saat 10:00 yerel saatte açılıyor. DST kullanan bir zaman dilimi içinde, tabiki yerel açılış zamanı DST-ayarlanmış süreyi de izler. Öyleyse yerel saatten utc zamanına nasıl giderim.Python - DST ile düzeltilmiş yerel saatten UTC'ye doğru

Argümanlar:

İhtiyacım olan fonksiyon şöyle to_utc(localdt, tz) olduğunu

  • localdt: localtime, naif datetime nesnesi olarak,
  • tz DST ayarlı: TZ-formatında dilimini, Örneğin 'Avrupa/Berlin'

İade:

  • datetime nesnesi UTC, zaman dilimi farkında

DÜZENLEME:

büyük zorluk yerel saat algılamak için

olduğunu DST ile aynı zamanda DST'nin ayarlandığı anlamına gelir.

  • Jan 1st 10:00 => 1 Ocak 09:00 UTC
  • 1 Temmuz 10:00 => 1 Temmuz: yaz aylarında 1 DST vardır 'Europe/Berlin' için

    08:00 UTC
  • hiçbir DST bulunur Afrika/Lagos 'için

:

  • Jan 1st 10:00 => 1 Ocak 09:00 UTC
  • 1 Temmuz 10:00 => 1 Temmuz 09:00 UTC
+0

: 01:00 de 27 Mart 2011, saatler 02:00 ileriye kuruldu. Yani 01:00 ile 02:00 arasındaki aralık geçersizdir. 30 Ekim 2011 saat 01:00, saatler 00: 00'a kadar ayarlanacaktır. Yani 00:00 ile 01:00 arasındaki aralık belirsiz. –

+1

'pytz', DST geçişlerinin herhangi bir zaman dilimi için çalışmadığını açıklar. Zaman dilimlerine yardımcı olacak şekilde özel olarak hazırlanmış bir paket bunu desteklemiyorsa, kendiniz için doğru bir şekilde yapmanız çok fazla iş demektir. Neredeyse haklı bir yere yerleşmen gerekecek. – agf

cevap

7
pytz kullanma

ve özellikle onun localize method:

import pytz 
import datetime as dt 

def to_utc(localdt,tz): 
    timezone=pytz.timezone(tz) 
    utc=pytz.utc 
    return timezone.localize(localdt).astimezone(utc) 

if __name__=='__main__': 
    for tz in ('Europe/Berlin','Africa/Lagos'): 
     for date in (dt.datetime(2011,1,1,10,0,0), 
       dt.datetime(2011,7,1,10,0,0), 
       ): 
      print('{tz:15} {l} --> {u}'.format(
       tz=tz, 
       l=date.strftime('%b %d %H:%M'), 
       u=to_utc(date,tz).strftime('%b %d %H:%M %Z'))) 

verir

Tuzak
Europe/Berlin Jan 01 10:00 --> Jan 01 09:00 UTC 
Europe/Berlin Jul 01 10:00 --> Jul 01 08:00 UTC 
Africa/Lagos Jan 01 10:00 --> Jan 01 09:00 UTC 
Africa/Lagos Jul 01 10:00 --> Jul 01 09:00 UTC 
+0

Harika, teşekkürler :) –

+2

not: bazı yerel saatler belirsiz. DST geçişi sırasında bir bankanın bir kerede açılması olası değildir; Bunu yapmak için '.localize()' 'is_dst = None' parametresini kullanabilirsiniz. – jfs

1
from datetime import datetime, tzinfo, timedelta 

class GMT1(tzinfo): 
    def utcoffset(self, dt): 
     return timedelta(hours=1) 
    def dst(self, dt): 
     return timedelta(0) 
    def tzname(self,dt): 
     return "Europe/Prague" 
year, month, day = 2011, 7, 23 
dt = datetime(year, month, day, 10) 

class UTC(tzinfo): 
    def utcoffset(self, dt): 
     return timedelta(0) 
    def dst(self, dt): 
     return timedelta(0) 
    def tzname(self,dt): 
     return "UTC" 

def utc(localt, tz): 
    return localt.replace(tzinfo=tz).astimezone(UTC()) 

print utc(dt, GMT1()) 

Yeni Sürüm. İstediğinizi yapar - naif bir datetime ve bir saat dilimi alır ve bir UTC tarihini döndürür.

+0

Çözümünüz, ana sorunu çözmek için başarısız oluyor: DST'nin otomatik kullanımı. –

+0

Anladığımdan emin değilim. Kullandığınız 'tzinfo' DST için bir 'timedelta' varsa, otomatik olarak utcnow() 'tarafından ele alınmalıdır? – agf

+0

Şimdi anladım. Cevabımı güncelledi. – agf

İlgili konular