Python datetime ke string tanpa komponen mikrodetik


410

Saya menambahkan string waktu UTC ke respons API Bitbucket yang saat ini hanya berisi string waktu Amsterdam (!). Untuk konsistensi dengan string waktu UTC yang dikembalikan ke tempat lain, format yang diinginkan adalah 2011-11-03 11:07:04(diikuti oleh +00:00, tetapi itu tidak benar).

Apa cara terbaik untuk membuat string seperti itu ( tanpa komponen mikrodetik) dari datetimeinstance dengan komponen mikrodetik?

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

Saya akan menambahkan opsi terbaik yang terpikir oleh saya sebagai jawaban yang mungkin, tetapi mungkin ada solusi yang lebih elegan.

Sunting: Saya harus menyebutkan bahwa saya sebenarnya tidak mencetak waktu saat ini - saya dulu datetime.nowmemberikan contoh cepat. Jadi solusinya tidak boleh berasumsi bahwa setiap datetimecontoh yang diterimanya akan mencakup komponen mikrodetik.

Jawaban:


840

Jika Anda ingin memformat datetimeobjek dalam format tertentu yang berbeda dari format standar, sebaiknya tetapkan format itu secara eksplisit:

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

Lihat dokumentasidatetime.strftime() untuk penjelasan %arahan.


10
Seorang kolega baru saja meyakinkan bahwa ini adalah pendekatan yang benar. Anggap saya yakin.
davidchambers

3
Apa itu kasus yang meyakinkan - menempatkan solusi ini di atas solusi Anda menggunakan datetime.replace?
matlehmann

13
@matlehmann: Tentu saja saya tidak tahu argumen rekan kerja davidchambers. Namun, saya pikir jika niat Anda adalah untuk mencetak tanggal dalam format yang sangat spesifik, Anda harus eksplisit tentang niat ini. Kode dalam jawaban ini mengatakan "luangkan waktu saat ini dan format persis seperti ini". Kode dalam jawaban lain mengatakan "luangkan waktu saat ini, atur mikrodetik ke 0, dan kemudian konversikan ke string entah bagaimana".
Sven Marnach

3
+1, secara eksplisit tentang format string menghindari masalah jika konversi datetime-str standar berubah dalam versi Python di masa depan
Alan Evangelista

2
@DylanYoung Persyaratan OP adalah untuk mencetak objek datetime dalam format yang berbeda dari format standar yang dikembalikan oleh .isoformat(), yang mencakup mikrodetik secara default. Jika itu yang Anda butuhkan, jelaskan tentang hal itu. Semua orang akan segera mengerti apa yang kode ini lakukan. Hampir tidak ada orang yang mengerti kode lain tanpa melihat dokumentasi.
Sven Marnach

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


1
dalam situasi saya, tanggal telah dibangun dan saya perlu "lantai" ke yang kedua. ini sempurna, terima kasih.
Vigrond

1
Ini jawaban terbaik!
Havok

Jauh lebih baik daripada memformat atau mem-parsing string untuk perbandingan, terima kasih.
Zach Young

69

Dengan Python 3.6:

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
Saya pikir sekarang, 8 tahun kemudian dengan munculnya Python 3.6 ini harus menjadi jawaban universal yang diterima. Ini menawarkan yang lebih baik dari kedua dunia yang diperdebatkan oleh @DylanYoung dan AlexanderMP pada utas yang sama di sini
pfabri


47

Inilah cara saya melakukannya. Format ISO:

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

Anda dapat mengganti 'T' jika Anda tidak menginginkan format ISO:

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

Ini mirip dengan jawaban saya. Apakah ada alasan untuk mendukung .isoformat()lebih unicode()?
davidchambers

1
Tergantung pada apa yang Anda inginkan, jika Anda ingin menggunakan representasi string python unicode(), dan jika Anda menginginkan ISO-8601, gunakanisoformat()
radtek

Saya melihat. unicode()lebih nyaman daripada .isoformat().replace('T', ' '), tentu saja. ;)
davidchambers

Saya hanya akan menggunakan solusi Sven untuk format non-iso, yang lebih eksplisit: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), tetapi mengganti 'T' hanyalah yang lain cara. Mungkin solusi terbaik jika Anda membutuhkan ISO dan tanggal unicode.
radtek

isoformatmenerima specifier pemisah, jadi tidak ada penggantian yang harus dilakukan. lakukan saja:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

Pilihan lain:

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

Secara default ini menggunakan waktu lokal, jika Anda memerlukan UTC Anda dapat menggunakan yang berikut:

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

Downvote karena OP bertanya tentang datetime, bukan waktu.
Jürgen A. Erhard

15

Simpan 19 karakter pertama yang Anda inginkan melalui slicing:

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

5
Ini hanya salah karena rangkaian waktu dapat menambahkan spesifikasi zona waktu, mis +05:30. Benar str(now())[:19].
K3 --- rnc

1
@ K3 --- rnc: Terima kasih. Diperbarui sesuai saran Anda.
Steven Rumbalski

setelah tahun 10000, yang kedua akan dilewatkan
diti

waktu akan memberi tahu @diti;)
yǝsʞǝla

8

Saya biasanya melakukan:

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

# To print now:
print(now)

keluaran:

2019-01-13 14:40:28

7

Karena tidak semua datetime.datetimeinstance memiliki komponen mikrodetik (yaitu ketika nol), Anda dapat mempartisi string pada "." dan hanya mengambil item pertama, yang akan selalu berfungsi:

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

3

Kita dapat mencoba sesuatu seperti di bawah ini

import datetime

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

Ini lebih rendah daripada .isoformat(' ', 'seconds'), yang diusulkan dalam jawaban sebelumnya.
davidchambers

1
Ketika saya mencoba di atas yang diusulkan jawaban sebelumnya, saya mendapatkan kesalahan di bawah >>> datetime.datetime.now (). Isoformat ('', 'seconds') Traceback (panggilan terakhir terakhir): File "<stdin>", line 1, dalam <module> TypeError: isoformat () membutuhkan paling banyak 1 argumen (2 diberikan)
Abhishek Bajaj

Ah, begitu. Ini bekerja untuk saya dalam Python 3 tetapi tidak dalam Python 2.
davidchambers

Saya menggunakan versi python 3.4.3, karena saya melihat kesalahan itu. >>> datetime.datetime.now (). isoformat ('', 'seconds') Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, di <module> TypeError: isoformat () paling banyak mengambil 1 argumen (2 diberikan)
Abhishek Bajaj

1

Saya menemukan ini sebagai cara paling sederhana.

>>> 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' imo lebih mudah. Tapi mudah bukan selalu yang terbaik
Aneh

1

Ini saya gunakan karena saya bisa mengerti dan karenanya mengingatnya lebih baik (dan format waktu tanggal juga dapat disesuaikan berdasarkan pilihan Anda): -

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

Cemerlang. Sederhana, fleksibel, dan tidak tergantung platform (tidak seperti strftime).
Endre Keduanya
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.