Python'un time.time () yöntemi yerel veya UTC zaman damgasını döndürüyor mu?


559

Does time.time()Python zaman modülünde sistemin saati veya UTC kez iade?


87
Zaman damgalarının zaman dilimleri yoktur. Dönemden bu yana geçen birkaç saniyeyi temsil ederler. Dönem, zaman dilimine bağlı olmayan belirli bir andır.
jwg

2
@jwg: yaygın olarak kullanılan POSIX zaman damgaları artık saniye saymaz ve bu nedenle "yakın zamandan beri geçen [geçen SI] saniye sayısı" değildir.
jfs

7
Bunun doğru bir itiraz olduğunu düşünmüyorum @JFSebastian. Artık saniye 'çağdan beri geçen saniye' değildir. Bunlar, geçen saniyelere karşılık gelmeyen saatler tarafından kaydedilen zaman gösterimlerindeki değişikliklerdir.
jwg

4
@JFSebastian Karışıklık için üzgünüm. Artık saniye 'geçen saniye' değildir. Bu nedenle, 'geçen saniye sayısı' olan zaman damgaları artık saniye içermez ve içermemelidir.
jwg

2
@jwg yanlış. Fiziksel zamanı silemezsiniz. POSIX zaman damgası geçen SI saniyesinin sayısı değil. İşte bir örnek: New York'ta "31 Aralık 2016, 18:59:59 pm" ve "31 Aralık 2016, 19:00:01 pm" arasında 3 saniye geçti ancak karşılık gelen POSIX zaman damgalarındaki fark sadece 2 saniyedir ( artık saniye sayılmaz).
jfs

Yanıtlar:


780

time.time()İşlev saniye, dönemin itibaren saniye sayısını verir. "Çağ" ın UTC'de 1 Ocak 1970 başlangıcı olarak tanımlandığını unutmayın. Böylece dönem UTC cinsinden tanımlanır ve zaman içinde küresel bir an oluşturur. Nerede olursanız olun, "saniye geçtiğinde" (time.time ()) aynı anda aynı değeri döndürür.

İşte bilgisayarımda koştum, bir dizeye de dönüştüren bazı örnek çıktı.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

tsDeğişken saniyede döndürülen zamandır. Daha sonra datetimekütüphaneyi kullanarak okunabilir bir dize haline getirerek bir dizeye dönüştürdüm .


72
Neden import timedatetime size zaman damgası verdiğinde. Milisaniyeyi kaldırın -str(datetime.datetime.now()).split('.')[0]
Hussain

17
@Alexis Unix dönemi burada oldukça açık bir şekilde tanımlanmıştır . Hatta bir Python örneğini sayfadan aşağıya doğru bir şekilde işaret ediyor. Yorumunu anlamıyorum.
squiguy

9
@squiguy dürüst olmak gerekirse, bana bunu söyleten şeyi hatırlamıyorum. Bir şeyi yanlış okumalıydım ve nihayet Fransa ve ABD arasında taşındığımda niçin bazı testlerin kırıldığını bulmak için uğraşıyordum. Bunun için üzgünüm ve bunu işaret ettiğiniz için teşekkür ederim.
Alexis

5
"UTC'de saniye" değildir . . Tarafından döndürülen zaman damgası time.time()herhangi bir saat diliminde değil . "çağdan beri geçen saniye" bir terimdir; Bu değildir geçen süre (Epoch) bir noktada yana saniye. Sen edebilirsiniz dönüştürmek kolay ve / veya UTC saat dilimine (tz veritabanı ile) yerel saate onu. btw, düşürürseniz .strftime()sonuç (neredeyse) aynıdır (+/- mikrosaniye).
jfs

3
Sadece test ettim, time.time () UTC saati vermiyor, yerel bölge
saatimi

301

Bu, metin dosyalarınızda kullanılabilecek bir zaman damgasının metin formu içindir . (Sorunun başlığı geçmişte farklıydı, bu nedenle bu cevaba giriş, zaman olarak nasıl yorumlanabileceğini açıklığa kavuşturmak için değiştirildi. [Updated 2016-01-14])

Sen kullanarak bir dize olarak damgası alabilirsiniz .now()ya .utcnow()ait datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

nowDan farklıdır utcnow: aksi halde aynı şekilde çalışır - beklendiği gibi

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Dizeye zaman damgasını açıkça oluşturabilirsiniz:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

Veya zaman damgasını istediğiniz gibi biçimlendirmek için daha açık olabilirsiniz:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

ISO biçimini istiyorsanız .isoformat(), nesnenin yöntemini kullanın :

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Bunları, hesaplamalar ve dönüşüm olmadan yazdırma için değişkenlerde kullanabilirsiniz.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980

1
Dönem zamanı istedim .... tarih biçiminde değil ... komut time.time () sözümden açıkça görüldüğü gibi
Saransh Mohapatra

34
Tamam sorun değil. Başka birinin metin dosyalarına yerleştirmek için zaman damgasına ihtiyacı olabilir .
pepr

1
Başka biriyim, muhtemelen makul olmayan upvotes sayısı nedeniyle buraya yönlendirildim . Soru hatalı biçimlendirilmiş ve kabul edilen cevap tipik ihtiyaç için yanıltıcı: en çok kullanılan sunucu saat diliminde okunabilir bir sonek - dosya adları için - demek.

Bir dizenin parçası olarak bir zaman damgası yazdırmak için şunu kullanın: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()şeytan. Yerel saat olmayan saf bir tarih oluşturur. Yerel saatiniz UTC değilse YANLIŞ olacaktır. datetime.datetime.now(datetime.timezone.utc)Bunun yerine kullanın . Bu, geçerli saati temsil eden saat dilimi farkında bir tarih oluşturur.
Terrel Shumway

139

#Squiguy'un cevabına dayanarak, gerçek bir zaman damgası almak için onu şamandıradan yazarım.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

En azından bu kavram.


1
Zaman damgasını yazmanın nedeni nedir? Varsayılan olarak türü nedir?
Tizzee

3
@Tizzee type(time.time())gives<type 'float'>
famousgarkin

4
Ancak saniyeler içinde olduğundan daha kesin zamana ihtiyacınız varsa, şamandıra mantıklıdır.
pepr

3
@RudiStrydom: Python kuvvetle yazılmıştır. Statik olarak yazılmasıyla karıştırmayın.
jfs

1
@CheokYanCheng: int()polimorfiktir. longGerekirse eski Python sürümlerinde dönecektir - tüm tamsayılar yeni Python sürümlerinde uzundur.
jfs

30

Cevap, ne ikisi de ne de olabilir.

  • ikisi de: time.time()Dönemden bu yana geçen saniye sayısını döndürür. Sonuç saat dilimine bağlı değildir, dolayısıyla ne UTC ne de yerel saattir. İşte "Çağdan Beri Saniye" için POSIX tanımı .

  • her ikisi: time.time()sistem saatinizin senkronize olmasını gerektirmez, bu nedenle değerini yansıtır (yerel saat dilimi ile ilgisi yoktur). Farklı bilgisayarlar aynı anda farklı sonuçlar alabilir. Bilgisayarınız zaman Öte yandan edilir daha sonra senkronize o (biz artık saniye göz ardı edersek) damgası UTC saati almak kolaydır:

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

Çeşitli Python sürümlerinde UTC saatinden zaman damgalarını nasıl alacağınız hakkında bilgi için UTC'ye göre çağdan bu yana nasıl bir tarihe dönüştürülür?


4
Bu, datetime.utcfromtimestampbir cevapta 308 upvotes varken doğru bir şekilde bahseten tek cevaptır datetime.fromtimestamp:-(

@TerrelShumway soru time.time()işlevin ne döndürdüğü ile ilgilidir (çok kısa). Yorumunuz başka bir soruya değiniyor (yorumunuzu cevaplamaya başladığımdan beri değiştirdiniz. Daha da kötüsü). Bir kenara not; "doğru" kelimesi idareli kullanılmalıdır (zaman dilimleri karmaşıktır - gümüş mermi yoktur - sadece belirli bir kullanım durumu için değiş tokuş yapar).
jfs

Kullanmayın datetime.datetime.utcfromtimestamp(ts). Yerel saatiniz UTC değilse, YANLIŞ olacaktır, çünkü yerel saat olmayan saf bir tarih oluşturur. datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)Bunun yerine kullanın . Bu, zaman damgasıyla aynı anı temsil eden saat dilimi farkında bir tarih oluşturur.
Terrel Shumway

Evet. Önceki yorumum yanlıştı. Datetime modülündeki kodun çoğu, saf zamanları yerel saat olarak kabul eder. Saf tarihler kullanmak, kodlamayı bilmeden bir metin dosyasını açmak gibidir.
Terrel Shumway

@TerrelShumway UTC saatinin yalnızca yerel saatin bulunduğu sistemlerde kullanılabileceğini varsaymak yanlıştır. Stdlib'in bazı bölümlerinin naif datetime nesnelerine yerel saat dilimine (pişman olarak) sahip olduğu doğrudur. Python 3'te artık naive_dt.astimezone()örtük gibi var olmamayı tercih ederim bytes.encode(). Birçok durumda dahili olarak UTC saatiyle çalışmanın faydalı olduğu doğrudur. Datetime modülü hakkında söylenebilecek çok şey var (altın bir rozet almak için yeterli soruya cevap verdim) çoğu soru için kapsam dışı: ne time.time()döner.
jfs

4

Sonunda yerleştim:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
Bu, yerel ihtiyaçlarınızı karşılayabilir, ancak bu aralıktaki sayıların [GMT] çağından bu yana saniyeler olmasını bekleyen insanlar için yanıltıcı olabilir. time.time()ondalık / şamandıra gibi döndürür 1574115250.818733ve milisaniye-beri-dönem kolayca int(time.time() * 1000)örn.1574115254915
MarkHu

3

Belirli bir zaman diliminde "dönem" diye bir şey yoktur. Dönem, zaman içinde belirli bir an olarak iyi tanımlanmıştır, bu nedenle saat dilimini değiştirirseniz, zamanın kendisi de değişir. Özellikle, bu sefer Jan 1 1970 00:00:00 UTC. Böylece time.time()dönemden bu yana geçen saniye sayısını döndürür.


UTC'nin bir saat dilimi değil , bir saat standardı olduğu doğru olsa da , standart GMT ile aynı saati paylaşmasıdır. Yani ....
Craig Hicks

3

zaman damgası her zaman utc cinsinden zamandır, ancak aradığınızda datetime.datetime.fromtimestamp yerel zaman diliminizde bu zaman damgasına karşılık gelen zamanı döndürür, bu nedenle sonuç yerel ayarınıza bağlıdır.

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

arrowFarklı davranışları olan güzel bir kütüphane var . Aynı durumda UTC saat dilimi ile size zaman nesnesi döndürür.

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
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.