Python datetime เป็นสตริงที่ไม่มีคอมโพเนนต์ microsecond


410

ฉันกำลังเพิ่มสตริงเวลา UTC ลงในการตอบสนอง Bitbucket API ที่ขณะนี้มีสตริงเวลา Amsterdam (!) เท่านั้น สำหรับความสอดคล้องกับสตริงเวลา UTC ที่ส่งคืนที่อื่นรูปแบบที่ต้องการคือ2011-11-03 11:07:04(ตามด้วย+00:00แต่นั่นไม่ใช่สิ่งที่มีค่า)

เป็นวิธีที่ดีที่สุดในการสร้างสตริงดังกล่าว ( ไม่มีส่วนประกอบ microsecond) จากdatetimeตัวอย่างที่มีส่วนประกอบ microsecond อะไร

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

ฉันจะเพิ่มตัวเลือกที่ดีที่สุดที่เกิดขึ้นกับฉันเป็นคำตอบที่เป็นไปได้ แต่อาจมีทางออกที่สง่างามกว่า

แก้ไข:ฉันควรพูดถึงว่าฉันไม่ได้พิมพ์เวลาปัจจุบันจริง ๆ - ฉันใช้datetime.nowเพื่อให้ตัวอย่างรวดเร็ว ดังนั้นการแก้ปัญหาไม่ควรสันนิษฐานว่าdatetimeอินสแตนซ์ใด ๆ ที่ได้รับจะรวมส่วนประกอบไมโครวินาที

คำตอบ:


840

หากคุณต้องการจัดรูปแบบdatetimeวัตถุในรูปแบบเฉพาะที่แตกต่างจากรูปแบบมาตรฐานจะเป็นการดีที่สุดที่จะระบุรูปแบบดังกล่าวอย่างชัดเจน:

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

ดูเอกสารประกอบdatetime.strftime()สำหรับคำอธิบายของ%คำสั่ง


10
เพื่อนร่วมงานเพิ่งสร้างกรณีที่น่าเชื่อถือเพราะนี่เป็นแนวทางที่ถูกต้อง พิจารณาฉันเชื่อมั่น
davidchambers

3
กรณีที่น่าเชื่อถือคืออะไร - วางโซลูชันนี้เหนือโซลูชันของคุณโดยใช้ datetime.replace
matlehmann

13
@matlehmann: แน่นอนฉันไม่ทราบข้อโต้แย้งของเพื่อนร่วมงานของ davidchambers อย่างไรก็ตามฉันคิดว่าถ้าความตั้งใจของคุณคือการพิมพ์วันที่ในรูปแบบที่เฉพาะเจาะจงมากคุณควรมีความชัดเจนเกี่ยวกับความตั้งใจนี้ รหัสในคำตอบนี้บอกว่า "ใช้เวลาในปัจจุบันและจัดรูปแบบเหมือนกันทุกประการ" รหัสในคำตอบอื่น ๆ ระบุว่า "ใช้เวลาปัจจุบันตั้งค่าไมโครวินาทีเป็น 0 แล้วแปลงเป็นสตริงอย่างใด"
Sven Marnach

3
+1 ชัดเจนเกี่ยวกับรูปแบบสตริงเพื่อหลีกเลี่ยงปัญหาหากการแปลง datetime-str มาตรฐานเปลี่ยนเป็นเวอร์ชัน Python ในอนาคต
Alan Evangelista

2
@DylanYoung ความต้องการของ OP คือการพิมพ์วัตถุ datetime ในรูปแบบที่แตกต่างจากรูปแบบมาตรฐานที่ส่งกลับ.isoformat()ซึ่งรวมถึง microseconds เป็นค่าเริ่มต้น ถ้านั่นคือสิ่งที่คุณต้องการให้ชัดเจนเกี่ยวกับมัน ทุกคนจะเข้าใจทันทีว่าโค้ดนี้ทำอะไร ทุกคนแทบจะไม่เข้าใจรหัสอื่น ๆ โดยไม่ได้ดูเอกสารประกอบ
Sven Marnach

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

20
ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ถูกต้องเพราะสามารถอ่านและบันทึกพฤติกรรมที่สอดคล้องกัน: " .isoformat([sep])- ส่งคืนสตริงที่แทนวันที่และเวลาในรูปแบบ ISO 8601, YYYY-MM-DDTHH: MM: SS.mmmmmm หรือถ้า microsecond เป็น 0, YYYY-MM-DDTHH: MM: SS "
Bengt

1
ในสถานการณ์ของฉันวันที่ได้ถูกสร้างขึ้นแล้วและฉันต้องการที่จะ "ชั้น" มันไปที่สอง มันสมบูรณ์แบบขอบคุณ
Vigrond

1
นี่คือคำตอบที่ดีที่สุด!
Havok

ดีกว่าการจัดรูปแบบหรือแยกสตริงสำหรับการเปรียบเทียบขอบคุณ
Zach Young

69

ใน 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
ฉันคิดว่าตอนนี้ 8 ปีต่อมาการถือกำเนิดของ Python 3.6 นี่ควรเป็นคำตอบที่เป็นสากล นี่เป็นข้อเสนอที่ดีกว่าของทั้งสองโลกที่โต้แย้งกันโดย @DylanYoung และ AlexanderMP ในหัวข้อเดียวกันนี้ที่นี่
pfabri


47

นี่คือวิธีที่ฉันทำ รูปแบบ ISO:

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

คุณสามารถแทนที่ 'T' หากคุณไม่ต้องการรูปแบบ ISO:

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

นี่คล้ายกับคำตอบของฉัน มีเหตุผลที่จะชอบ.isoformat()มากกว่าunicode()?
davidchambers

1
ขึ้นอยู่กับสิ่งที่คุณต้องการถ้าคุณต้องการใช้การเป็นตัวแทนสตริงไพunicode()ธ อนและถ้าคุณต้องการ ISO-8601 ให้ใช้isoformat()
radtek

ฉันเห็น. unicode()สะดวกกว่า.isoformat().replace('T', ' ')แน่นอน ;)
davidchambers

ฉันจะใช้โซลูชันของ Sven สำหรับรูปแบบที่ไม่ใช่ iso ชัดเจนมากขึ้น: datetime.now (). strftime ("% Y-% m-% d% H:% M") แต่แทนที่ 'T' เป็นเพียงอีก ทาง อาจเป็นทางออกที่ดีที่สุดหากคุณต้องการทั้ง ISO และ unicode date
radtek

isoformatยอมรับตัวระบุตัวคั่นดังนั้นจึงไม่ควรทำการแทนที่ เพิ่งทำ:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

อีกตัวเลือกหนึ่ง:

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

โดยค่าเริ่มต้นนี้ใช้เวลาท้องถิ่นถ้าคุณต้องการ UTC คุณสามารถใช้สิ่งต่อไปนี้:

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

Downvote เนื่องจาก OP ถามเกี่ยวกับวันที่และเวลาไม่ใช่เวลา
Jürgen A. Erhard

15

เก็บ 19 อักขระแรกที่คุณต้องการด้วยการแบ่งส่วน:

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

5
+05:30นี้ไม่ถูกต้องเพียงเพราะสตริงเวลาสามารถมีสเปเขตเวลาต่อท้ายเช่น str(now())[:19]ที่ถูกต้องจะเป็น
K3 --- rnc

1
@ K3 --- rnc: ขอบคุณ อัปเดตตามคำแนะนำของคุณ
Steven Rumbalski

หลังจากปี10000ที่สองจะพลาด
Diti

เวลาจะบอก @diti;)
yǝsʞǝla

8

ฉันมักจะทำ:

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

# To print now:
print(now)

เอาท์พุท:

2019-01-13 14:40:28

7

เนื่องจากdatetime.datetimeอินสแตนซ์ทั้งหมดไม่ได้มีส่วนประกอบไมโครวินาที (เช่นเมื่อเป็นศูนย์) คุณสามารถแบ่งพาร์ติชันสตริงเป็น "" และใช้เฉพาะรายการแรกซึ่งจะทำงานเสมอ:

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

3

เราสามารถลองทำสิ่งต่อไปนี้

import datetime

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

นี่มันด้อยกว่าที่.isoformat(' ', 'seconds')เสนอในคำตอบก่อนหน้านี้
davidchambers

1
เมื่อฉันพยายามตอบข้อเสนอข้างต้นฉันได้รับข้อผิดพลาดด้านล่าง >>> datetime.datetime.now (). isoformat ('', 'วินาที') Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัด 1 ใน <module> TypeError: isoformat () รับได้สูงสุด 1 อาร์กิวเมนต์ (ให้ 2 อัน)
Abhishek Bajaj

อ่าฉันเข้าใจแล้ว มันใช้งานได้สำหรับฉันใน Python 3 แต่ไม่ใช่ใน Python 2
davidchambers

ฉันใช้ python 3.4.3 เวอร์ชั่นซึ่งฉันเห็นข้อผิดพลาดนั้น >>> datetime.datetime.now (). isoformat ('', 'วินาที') Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัดที่ 1 ใน <module> TypeError: isoformat () ใช้เวลาไม่เกิน 1 อาร์กิวเมนต์ (มอบให้ 2 ครั้ง)
Abhishek Bajaj

1

ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุด

>>> 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 ง่ายกว่ามาก แต่เรื่องง่ายไม่ใช่สิ่งที่ดีที่สุด
An0n

1

ฉันใช้เพราะฉันเข้าใจและจำได้ดีกว่า (และรูปแบบวันที่ยังสามารถปรับแต่งตามที่คุณเลือก): -

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

สุกใส ง่ายยืดหยุ่นและไม่ขึ้นอยู่กับแพลตฟอร์ม (ต่างจาก strftime)
สิ้นสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.