2012-11-06 24 views
25

Normal unix süresi arasında ileri ve geri dönüşüm sağlayan bir çift işlev, dt ve ut yazmayı deniyorum 1970-01-01 00:00:00 UTC) ve bir Python datetime nesnesi. dt ve ut uygun inversleri idiBir unttime nesnesini bir datetime nesnesine dönüştürün ve tekrar (eşleştirilen zaman dönüştürme işlevleri çifti)

o zaman bu kodun iki kez aynı zaman damgası basmak olacaktır:

import time, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.fromtimestamp(u) 
def ut(d): return time.mktime(d.timetuple()) 

u = 1004260000 
print u, "-->", ut(dt(u)) 

Ne yazık ki, ikinci zaman damgası ilkinden daha az 3600'dür (bir saat) 'dir. Bence bu sadece çok özel unixtimes için olur, belki o saatlerde o gün ışığından yararlanma saati atlar. Ama dt ve ut yazmanın bir yolu var, bu yüzden birbirlerinin gerçek tersleri mi?

İlgili soru: Making matplotlib's date2num and num2date perfect inverses

+0

btw fonksiyon şey yapmaz ancak başka işlevi ile çağırırsa, Bu fromtimestamp() kullanırken geri yaz saati rulo sırasında düşmek kez almak için ne çoklu farklı zaman damgaları, aynı datetime.datetime nesneye harita anlamına gelir Aynı argümanlar sonra atayabilirsiniz: 'dt = datetime.datetime.utcfromtimestamp'. İşlevler Python'da birinci sınıf vatandaşlardır: bunları başka bir işleve parametre olarak geçirebilir, işlevlerden dönebilirsiniz. – jfs

+0

Ah, güzel, harika nokta! Bunu yapmak daha mı yoksa özlü bir mesele mi? Peki ya f (x) 'ye ne dersiniz: foo (x) 'vs' f = lambda x: foo (x) '? (Benim hatırlamam, bunların hem işlevsel hem de verimlilik açısından eşdeğerdir.) – dreeves

+0

'f = g', f, g'nin aynı işleve karşılık gelen iki ad olduğu anlamına gelir. "def" ve "lambda" yeni işlevler yaratır. – jfs

cevap

37

Bu davranış, yaz saati ile ilişkili olduğunu doğrudur. Bunu önlemenin en kolay yolu, gün ışığından yararlanmayan bir saat dilimi kullanabilmenizdir. UTC, buradaki en mantıklı ifadedir.

datetime.datetime.utcfromtimestamp() ve calendar.timegm() UTC zamanları ile anlaşma yapar ve tam tersidir. İşte

import calendar, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.utcfromtimestamp(u) 
def ut(d): return calendar.timegm(d.timetuple()) 

olduğunu datetime.datetime.fromtimestamp() dokümanlardan yaz saati uygulamasıyla ilgili bir sorunu vardır neden arkasında açıklama biraz:

Return yerel tarih ve saat POSIX zaman damgası tekabül olduğu gibi time.time() tarafından iade edildi. İsteğe bağlı argüman tz Yok veya belirtilmemişse, zaman damgası platformun yerel tarihine ve zamana dönüştürülür ve döndürülen datetime nesnesi naiftir.

Burada önemli kısmı nesnenin bir parçası olarak herhangi bir saat dilimi (veya yaz saati) bilgiler var demektir saf datetime.datetime nesne, elde edilmesi.

>>> datetime.datetime.fromtimestamp(1004260000) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
>>> datetime.datetime.fromtimestamp(1004256400) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
+0

Mükemmel; Teşekkürler! (Ve bunun benim için çalıştığını doğruladım.) – dreeves

+0

['ut = lambda naive_utc_dt: (naive_utc_dt - tarih (1970,1,1)) .total_seconds()'] (http://stackoverflow.com/a/ 8778548/4279) – jfs

+0

@JFSebastian, bunu bir cevap olarak eklemek ister misiniz? Haklısınız (versiyonunuzu doğrulamamış olmama rağmen) ve sizinki kabul edilen cevap burada olmalıdır. Posterlerde yol gösterme konusunda nefret etmekten nefret ediyorum, yorumlarda yalnızca bir linkle daha iyi bir şekilde işaret ediyor! – dreeves