Geçerli GMT zamanını Unix zaman damgası biçiminde almanın en kolay yolu nedir?


175

Python (farklı paketler sunar datetime, time, calendar) olarak görülebilir burada zaman başa amacıyla. Güncel GMT zamanını almak için aşağıdakileri kullanarak büyük bir hata yaptımtime.mktime(datetime.datetime.utcnow().timetuple())

Unix zaman damgasındaki geçerli GMT zamanını almanın basit yolu nedir?


1
Giriş / çıkış nedir? datetime.utcnow()Geçerli UTC zamanını datetime nesnesi olarak döndürür ("GMT zamanı" hakkında konuşurken UTC istediğinizi varsayalım). time.time()Unix zaman damgasını doğrudan kayan sayı olarak döndürür. UTC'de zamanı temsil eden datetime.date/datetime.datetime öğesini nasıl POSIX zaman damgasına dönüştüreceğiniz aşağıda açıklanmıştır .
jfs

Önerilen yöntem yanlış mı yoksa çok ayrıntılı mı? İlgili: stackoverflow.com/questions/15940280/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Metodunuz neden bir hataydı?
skeller88

Yanıtlar:


230

Dönemden bu yana saniye cinsinden bir zaman damgası almak için time.time () kullanırdım.

import time

time.time()

Çıktı:

1369550494.884832

Çoğu platformdaki standart CPython uygulaması için bu bir UTC değeri döndürür.


21
Yakalama, makinenizin yerel saatinin UTC'de olmaması olabilir.
9000

@ 9000: Doğru, ancak zaman tutmanın önemli olduğu herhangi bir ortamda UTC'de her zaman ısrar ediyorum. Ve en basit çözümü istedi. Linux, BSD, Mac OS X ve Windows gibi modern platformlardaki CPython ile hepsinin UTC'yi time.time () için döndüreceğini unutmayın. Bu, C standart kitaplığının zaman işlevinin bu işletim sistemlerindeki davranışını yansıtır.
Edmond Burnett

66
@ 9000: yerel saat dilimi önemli değil. Unix süresi UTC zamanına karşılık gelir (artık saniye cinsinden zamanı yoksayarsak). Bir düşünün: zaman damgası, çağdan bu yana geçen saniye sayısıdır (belirli bir zamanda): neden saat dilimi makinesinin yerel saatinin kullandığına bağlıdır? Herhangi bir zamanda Unix zamanı dünya çapında aynıdır. Bazı (bilinmeyen) platformlar farklı bir dönem kullanabilir, ancak değeri yine de yerel saat dilimine bağlı olmayacaktır.
jfs



42

Bu yardımcı olur mu?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Python UTC datetime nesnesini UNIX zaman damgasına dönüştürme


@Cairnarvon Bu sadece bir örnekti. Geçerli zaman damgasını istiyorsanız, o zaman arayabilir time.time()ve hiç datetime dönüşümüne ihtiyacınız yoktur.
Messa

1
FWIW: Bu UTC Saati değil, UTC yerel saate dönüştürülür. UTC'de bir zaman damgası almak için başka bir şey yapmanız gerekir.
Sherlock70

18

Veya sadece datetime standart modülünü kullanarak

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

İstediğiniz çözünürlüğe bağlı olarak kırpabilir veya çoğaltabilirsiniz. Bu örnek milis çıktısıdır.

Uygun bir Unix zaman damgası (saniye cinsinden) istiyorsanız ,* 1000


Sen kod çok özel bir tamsayı içine zaman zorlayarak çıkış metni neden ondalık sayı olduğundan kafam karıştı?
Weston

Sen

Bu, Javascript momentkütüphanelerinin tam karşılığıdır moment().utc().valueOf(). Tam aradığım şey. Teşekkürler
azhar22k

UNIX zaman damgasının 1970'den beri saniyeler olması gerekiyor. Çözümünüz bunu üretmiyor.
1919'da

1
"İstediğiniz çözünürlüğe bağlı olarak kısaltabilir veya çoğaltabilirsiniz" * 1000 parçasını bırakın ve saniye elde edin.
Maresh

18

python2 ve python3

zaman modülünü kullanmak iyidir

import time
int(time.time())

1573708436

datetime modülünü de kullanabilirsiniz, ancak strftime ('% s') kullandığınızda, ancak strftime zamanı yerel saatinize dönüştürür!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()

2
UTC + 1 olmak, time.time()ve datetime.utcnow().timestamp()do not aynı değeri vermek!
user136036

Ayrıca 2. seçeneğin doğru olmasını beklememe rağmen, UTC + 1100'de doğru değeri almak için datetime.now (). Timestamp () kullanmak zorunda kaldım. Ben zaman damgası () ya da doğru çalışması bekleniyor ama öyle görünmüyor
David Waterworth

Yakından baktığımızda, hem datetime.utcnow () hem da datetime.now (), naif bir datetime döndürür (tzinfo yok) ve tzinfo = null olduğunda zaman damgası () yerel kabul ediyor gibi görünür.
David Waterworth

2

Bu yöntemi seviyorum:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Burada yayınlanan diğer yöntemlerin size tüm platformlarda UTC vermesi veya yalnızca tüm saniyeleri bildirmesi garanti edilmez. Tam çözünürlük istiyorsanız, bu, mikro saniyeye kadar çalışır.


1
Ne yazık ki bu bir UTC + 0000 saat diliminde olmadıkça UTC vermiyor gibi görünüyor. utctimetupleBunun yerine kullanmak hile yapar.
1919'da

1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Çıktı:

1544524990

bu benim için geçerli değil time.time().
Alwinius

1
Bunun nedeni büyük olasılıkla saat dilimi bilgisi olmadan dt.utcnowdönmektir datetime. Sonra yerel saat strftimeolduğunu varsayar datetime.
1919'da

1
@skyking Bu hemen hemen bu sayfadaki tüm cevaplar için sorun!
David Waterworth

1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Çıktı: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Çıktı: 1572878043

  • Burada, ilk örneğin ikincisinden daha doğru zaman verdiğini görebiliriz.
  • Burada ilkini kullanıyorum.

1

En azından python3'te bu işe yarar:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
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.