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.

davidchambers
sumber

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.

Sven Marnach
sumber
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
davidchambers
sumber
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

codeif
sumber
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'
radtek
sumber
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'
Andrew Clark
sumber
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'
Steven Rumbalski
sumber
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
An0n
sumber
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]
Austin Marshall
sumber
3

Kita dapat mencoba sesuatu seperti di bawah ini

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]
Abhishek Bajaj
sumber
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'
>>> 
Muhammed Irfan
sumber
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))
satyakam shashwat
sumber
Cemerlang. Sederhana, fleksibel, dan tidak tergantung platform (tidak seperti strftime).
Endre Keduanya