Mikrosaniye bileşeni olmayan dizgiden python tarihine


410

Şu anda yalnızca Amsterdam (!) Zaman dizelerini içeren Bitbucket API yanıtlarına UTC zaman dizeleri ekliyorum. Başka bir yerde döndürülen UTC saat dizeleriyle tutarlılık için, istenen biçim 2011-11-03 11:07:04(ardından gelir +00:00, ancak bu almanca değildir).

(Örneğin bir dize oluşturmak için en iyi yolu nedir olmaksızın bir bir mikrosaniye bileşeni) datetimeörneği ile bir mikrosaniye bileşeni?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

Olası bir cevap olarak başıma gelen en iyi seçeneği ekleyeceğim, ancak daha zarif bir çözüm olabilir.

Düzenleme: Ben aslında şimdiki zaman yazdırmıyorum bahsetmeliyim - datetime.nowhızlı bir örnek sunmak için kullanılır . Dolayısıyla çözüm, datetimealdığı herhangi bir örneğin mikrosaniye bileşenlerini içereceğini varsaymamalıdır .

Yanıtlar:


840

Bir datetimenesneyi standart biçimden farklı bir biçimde biçimlendirmek istiyorsanız , bu biçimi açıkça belirtmek en iyisidir:

>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

Direktiflerin açıklaması için belgelerinedatetime.strftime() bakın %.


10
Bir meslektaşım, bunun doğru yaklaşım olması için ikna edici bir dava açtı. Beni ikna ettiğinizi düşünün.
davidchambers

3
Bu ikna edici durum neydi - bu çözümü datetime.replace kullanarak çözümünüzün üzerine koymak?
matlehmann

13
@matlehmann: Elbette davidchambers'ın meslektaşının argümanlarını bilmiyorum. Ancak, niyetiniz bir tarihi çok belirli bir formatta basmaksa, bu niyet konusunda açık olmalısınız. Bu yanıttaki kod "geçerli saati al ve tam olarak bu şekilde biçimlendir" diyor. Diğer yanıttaki kod, "şimdiki zamanı al, mikrosaniyeyi 0'a ayarla ve sonra bir şekilde bir dizeye dönüştür" diyor.
Sven Marnach

3
+1, dize biçimi hakkında açık olmak, gelecekteki bir Python sürümünde standart datetime-str dönüşümü değişirse sorunları önler
Alan Evangelista

2
@DylanYoung OP'nin gereksinimi, datetime nesnesini varsayılan olarak mikrosaniyeleri içeren standart biçimden farklı bir biçimde yazdırmaktır .isoformat(). İhtiyacınız olan şey buysa, açık olun. Herkes bu kodun ne yaptığını hemen anlayacak. Hiç kimse belgelere bakmadan diğer kodu anlayamaz.
Sven Marnach

172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07


1
benim durumumda, tarih zaten inşa edilmiştir ve ben ikinci "döşeme" gerekiyordu. bu mükemmel, teşekkürler.
Vigrond

1
Bu en iyi cevap!
Havok

Karşılaştırma için dizeleri biçimlendirmekten veya ayrıştırmaktan çok daha iyi, teşekkür ederim.
Zach Young

69

Python 3.6'da:

from datetime import datetime
datetime.datetime.now().isoformat(' ', 'seconds')
'2017-01-11 14:41:33'

https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat


4
Şimdi, 8 yıl sonra Python 3.6'nın ortaya çıkmasıyla birlikte, bunun kabul edilmiş evrensel bir cevap olması gerektiğini düşünüyorum. Bu aynı iş parçacığı üzerinde @DylanYoung ve AlexanderMP yaklaşık savundu iki dünyanın daha iyi bu teklifler burada
pfabri


47

Ben böyle yapıyorum. ISO formatı:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

ISO formatını istemiyorsanız 'T'yi değiştirebilirsiniz:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

Bu benim cevabımla aynı. Lehine bir nedeni var mı .isoformat()üzerinde unicode()?
davidchambers

1
İstediğinize, python dizesi temsilini kullanmak unicode()istiyorsanız ve ISO-8601 istiyorsanız, kullanınisoformat()
radtek

Anlıyorum. kesinlikle unicode()daha uygun .isoformat().replace('T', ' '). ;)
davidchambers

Sven'in çözümünü iso olmayan format için kullanırdım, daha açık: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), ancak 'T' yerine başka bir şey yol. Hem ISO hem de unicode tarihine ihtiyacınız varsa en iyi çözüm olabilir.
radtek

isoformatayırıcı belirleyiciyi kabul eder, bu nedenle değiştirilmemelidir. sadece yapmak:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

Yine başka bir seçenek:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

Varsayılan olarak bu yerel saati kullanır, UTC'ye ihtiyacınız varsa aşağıdakileri kullanabilirsiniz:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

Downv oy çünkü OP zaman değil tarih, sordu.
Jürgen A. Erhard

15

Dilimleyerek istediğiniz ilk 19 karakteri saklayın:

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

5
Bu yalnızca yanlıştır, çünkü zaman dizelerine saat dilimi belirtimi eklenmiş olabilir, örn +05:30. Doğru olurdu str(now())[:19].
K3 - rnc

1
@ K3 --- rnc: Teşekkürler. Öneri başına güncellendi.
Steven Rumbalski

yıl sonra 10000, bir saniye özlenecek
diti

time will tell @diti;)
yǝsʞǝla

8

Genellikle yaparım:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

çıktı:

2019-01-13 14:40:28

7

Tüm datetime.datetimeörneklerin mikrosaniye bileşeni olmadığı için (yani sıfır olduğunda), dizeyi bir "." ve her zaman işe yarayacak yalnızca ilk öğeyi alın:

unicode(datetime.datetime.now()).partition('.')[0]

3

Aşağıdaki gibi bir şey deneyebiliriz

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

Bu, daha .isoformat(' ', 'seconds')önceki bir cevapta önerilenden daha düşüktür .
davidchambers

1
Yukarıda önerilen önceki cevap denerken, ben aşağıda >>> datetime.datetime.now (). İsoformat ('', 'saniye') Geri izleme (en son çağrı son): Dosya "<stdin>", satır altına alıyorum 1, <modül> TypeError: isoformat () en fazla 1 argüman alır (2 verilir)
Abhishek Bajaj

Ah, anlıyorum. Python 3'te benim için çalışıyor ama Python 2'de değil.
davidchambers

Python 3.4.3 sürümünü kullanıyorum, bu hatayı görüyorum. >>> datetime.datetime.now (). isoformat ('', 'saniye') Geri izleme (en son çağrı son olarak): <module> TypeError: isoformat () içinde "<stdin>", satır 1 dosyası en fazla sürer 1 argüman (verilen 2)
Abhishek Bajaj

1

Bunu en basit yol olarak buldum.

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 

datetime.datetime.now (). strftime ("% Y-% m-% d% H:% M:% S") '2011-11-03 18:21:26' çok daha kolay imo. Ama kolay iyi değil alwast değil
An0n

1

Bunu anladığım ve dolayısıyla daha iyi hatırlayabildiğim için kullanıyorum (ve tarih saat formatı da seçiminize göre özelleştirilebilir):

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

Parlak. Basit, esnek ve platformdan bağımsız (strftime'ın aksine).
Endre Her ikisi de
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.