Tarih saatini Unix zaman damgasına dönüştürün ve python'da geri dönüştürün

Elimde dt = datetime(2013,9,1,11) var ve bu datetime nesnesinin Unix zaman damgasını almak istiyorum.

(dt - datetime(1970,1,1)).total_seconds()yaptığımda1378033200` zaman damgasını elde ettim.

Bunu datetime.fromtimestamp kullanarak geri dönüştürdüğümde datetime.datetime(2013, 9, 1, 6, 0) elde ettim.

Saat uyuşmuyor. Burada ne kaçırdım?

Çözüm

Burada kaçırdığınız şey zaman dilimleri.

Muhtemelen UTC'den beş saat uzaktasınız, bu nedenle 2013-09-01T11:00:00 yerel ve 2013-09-01T06:00:00Z aynı saatlerdir.

Zaman dilimleri ve "naive" ve "aware" nesneleri hakkında açıklama yapan datetime dokümanlarının üst kısmını okumanız gerekir.

Orijinal naif tarih saatiniz UTC ise, bunu kurtarmanın yolu fromtimestamp yerine utcfromtimestamp kullanmaktır.

Öte yandan, orijinal naif tarih saatiniz yerelse, ilk etapta ondan bir UTC zaman damgası çıkarmamalısınız; bunun yerine datetime.fromtimestamp(0) kullanın.

Ya da farkında bir datetime nesneniz varsa, her iki tarafta da yerel (farkında) bir epoch kullanmanız veya açıkça UTC'ye ve UTC'den dönüştürmeniz gerekir.

Python 3.3 veya daha yeni bir sürümüne sahipseniz ya da bu sürüme yükseltme yapabiliyorsanız, kendiniz nasıl yapacağınızı bulmaya çalışmak yerine timestamp yöntemini kullanarak tüm bu sorunlardan kaçınabilirsiniz. Ve bunu yapmasanız bile, kaynak kodunu ödünç almayı düşünebilirsiniz.

(Ve eğer Python 3.4'ü bekleyebilirseniz, PEP 341 muhtemelen son sürüme girecek gibi görünüyor, bu da J.F. Sebastian ve benim yorumlarda bahsettiğimiz tüm şeylerin sadece stdlib ile yapılabileceği ve hem Unix hem de Windows'ta aynı şekilde çalışacağı anlamına geliyor).

Yorumlar (9)

Bu ifade yerine dt den bir POSIX zaman damgası oluşturun,

(dt - datetime(1970,1,1)).total_seconds()

Bunu kullan:

int(dt.strftime("%s"))

Örneğinizde ikinci yöntemi kullanarak doğru yanıtı alıyorum.

EDIT: Bazı takipler... Bazı yorumlardan sonra (aşağıya bakın), strftime içindeki %s için destek veya dokümantasyon eksikliğini merak ettim. İşte bulduklarım:

Python kaynağında](https://github.com/python/cpython/blob/master/Modules/timemodule.c) datetime ve time için STRFTIME_FORMAT_CODES dizesi bize şunu söyler:

"Other codes may be available on your platform.
 See documentation for the C library strftime function."

Şimdi eğer man strftime (Mac OS X gibi BSD sistemlerinde) dersek, %s için destek bulacaksınız:

"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."

Her neyse, `%s'in çalıştığı sistemlerde çalışmasının nedeni budur. Ancak OP'nin sorunu için daha iyi çözümler var (zaman dilimlerini hesaba katan). Burada @abarnert'in kabul edilen cevabına bakın.

Yorumlar (9)

Unix zaman damgasına dönüştürürken, python temel olarak UTC'yi varsayar, ancak geri dönüştürürken size yerel saat diliminize dönüştürülmüş bir tarih verecektir.

Bu soru/cevaba bakınız; https://stackoverflow.com/questions/18812638/get-timezone-used-by-datetime-datetime-fromtimestamp

Yorumlar (0)