Python strftime - วันที่ไม่มีผู้นำ 0?


277

เมื่อใช้ Python strftimeจะมีวิธีการลบ 0 แรกของวันที่ถ้ามันอยู่ก่อนวันที่ 10 นั่นคือ เพื่อให้01เป็น1? ไม่พบสิ่ง%ที่ใช่หรือไม่

ขอบคุณ!

คำตอบ:


568

ที่จริงฉันมีปัญหาเดียวกันและฉันรู้ว่าถ้าคุณเพิ่มยัติภังค์ระหว่าง%และตัวอักษรคุณสามารถลบศูนย์นำ

%Y/%-m/%-dเช่น

ใช้งานได้กับ Unix (Linux, OS X) เท่านั้นไม่ใช่ Windows (รวมถึง Cygwin) ใน Windows คุณจะใช้เช่น#%Y/%#m/%#d


11
ใช้งานไม่ได้สำหรับฉันให้ ValueError (windows, python 2.6)
rocketmonkeys

14
มันใช้งานได้สำหรับฉันใน OS X แต่ฉันใช้ Python 2.7.2 จาก python.org
Tim Swast

13
@moose ฉันถามคำถามเกี่ยวกับสิ่งนี้ :-) นี่คือคำตอบ -> stackoverflow.com/questions/28894172/…
งัด

10
ValueError: '-' is a bad directive in format '%b %-d, %Y'ฉันได้รับ OSX, Python 2.7
Richard

8
%#dจะทำเช่นเดียวกันใน Windows
Dalle

190

เราสามารถทำสิ่งนี้กับการกำเนิดของformatวิธีตั้งแต่ python2.6:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

แม้ว่าอาจจะเกินขอบเขตของคำถามเดิม แต่สำหรับรูปแบบที่น่าสนใจยิ่งขึ้นคุณสามารถทำสิ่งต่อไปนี้:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

และในฐานะของ python3.6 สิ่งนี้สามารถแสดงเป็นสตริงที่จัดรูปแบบอินไลน์ :

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

2
ดีมาก! แต่น่าเสียดายที่ไม่ได้ทำงานคนเดียวถ้าคุณต้องการที่จะใช้แสดงเกี่ยวกับใจชอบtime.strftime('%A %B %d, %Y')ซึ่งอัตราผลตอบแทน Tuesday October 07, 2014(ตอนนี้อยู่กับสถานที่เป็นภาษาอังกฤษ)
Pekka Klärck

@ PekkaKlärck - เหตุผลบางอย่างที่ฉันไม่ได้สังเกตเห็นความคิดเห็นของคุณจนถึงตอนนี้ ปรากฎว่าวันที่และเวลาระบุ__format__เบ็ดที่น่าสนใจมากที่ช่วยให้คุณเขียนสิ่งเช่นนั้น
mgilson

2
ปัญหาหนึ่งคือการ'{dt.hour}'ใช้นาฬิกา 24 ชั่วโมง :( การใช้ตัวเลือกที่สองยังคงนำคุณกลับไปใช้'{%#I}'บน Windows และ'{%-I}'Unix
ubomb

จุดดี. ฉันไม่เคยใช้รหัสแทนนาฬิกา 12 ชั่วโมงในรหัสดังนั้นฉันจึงไม่คิดกรณีนั้น
mgilson

ฉันขอแนะนำให้ดูที่เอกสารเพิ่มเติมนี้ในฟังก์ชั่นการจัดรูปแบบ: pyformat.info
ทำเครื่องหมาย

37

บางแพลตฟอร์มอาจรองรับข้อกำหนดความกว้างและความแม่นยำระหว่าง%และตัวอักษร (เช่น 'd' สำหรับวันที่เดือน) ตามhttp://docs.python.org/library/time.html - แต่แน่นอนว่าไม่ใช่พกพา วิธีแก้ปัญหา (เช่นไม่ทำงานบน Mac ;-) บางทีคุณสามารถใช้สตริงแทนที่ (หรือ RE สำหรับรูปแบบที่น่ารังเกียจจริงๆ) หลังจากที่strftimeแก้ไขได้หรือไม่ เช่น:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus คุณหมายถึงอะไร มันควรส่งผลให้ '1 มกราคม 2000'
ผู้ใช้

6
@ ผู้ใช้รหัสข้างต้นตรวจสอบพื้นที่ว่างก่อน 0 ซึ่งในกรณีของ "01 มกราคม 2000" ไม่มีอยู่
Alagappan Ramu

@alex โปรดลบคำตอบนี้ตามที่คุณอาจจะทราบว่ามันอยู่ไกลจากคำตอบที่ถูกต้อง
CONVID19

29

นี่คือเอกสารของตัวดัดแปลงที่สนับสนุนโดยstrftime()ในไลบรารี GNU C (เหมือนที่คนอื่นพูดไว้ก่อนหน้านี้มันอาจจะไม่พกพาได้) ที่คุณอาจสนใจ:

  • %eแทนที่จะเป็นการ%dแทนที่ศูนย์นำในวันที่ของเดือนด้วยช่องว่าง

มันทำงานได้บน Python ของฉัน (บน Linux) ฉันไม่รู้ว่ามันจะทำงานกับคุณหรือไม่


3
% e ล้มเหลวสำหรับฉันบน Windows ด้วย Python 2.6 ฉันเดาว่ามันเป็นเฉพาะเจาะจง * เลวร้ายเกินไป :(
rocketmonkeys

1
นี่คือโซลูชันที่สะอาดที่สุดทั่วไปที่สุด --- บนระบบ * nix อย่างน้อยที่สุด สิ่งนี้ใช้ได้กับ OS X
BFTM

เช่นเดียวกับ%-d ข้างต้นสิ่งนี้ทำงานได้ใน OS X 10.8.5 กับ Python 2.7.2 แต่ไม่ใช่ใน Windows 7 Pro 64- บิตด้วย Python 2.7.3
Johan

1
สิ่งนี้ใช้ได้กับฉันใน Windows 7 SP1 ด้วย Python 3.5.1
Neil Billingham

1
นี่เป็นการเพิ่มพื้นที่ว่างแทนการเป็นศูนย์นำดังนั้นถ้าคุณกำลังมองหาการจับคู่ที่แน่นอนอาจไม่ได้ >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 พฤษภาคม 23' >>> สิบเอ็ด = วันที่และเวลา .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> eleven.strftime ('% b% e% H')
'11

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
ใช้งานได้วันที่ 1 มกราคม 2000 Alexs ใช้งานไม่ได้
guneysus

จุดประสงค์ของการทำ.replace('X0','X').replace('X','')คืออะไร? แค่ทำ.replace('X0', '')แล้วมันจะดี
Marco Bonelli

2
@MarcoBonelli: ลองคำแนะนำของคุณบนสตริง "X12 / X12 / 14" แล้วคุณจะเห็น
gdw2

1
นี่คือแฮ็ค แต่เป็นแฮ็ค ธ อร์ม
Josh M.


18

ค่อนข้างช้าไปงานปาร์ตี้ แต่ใช้%-dงานได้ที่ปลาย

datetime.now().strftime('%B %-d, %Y') ผลิตสิ่งที่ต้องการ "5 พฤศจิกายน 2014"

ไชโย :)


1
คำตอบที่ซ้ำกัน stackoverflow.com/a/2073189/389812
gdw2

2
ValueError: Invalid format stringในระบบ Windows ของฉัน
Deqing

10

ฉันพบว่าตัวกรองการจัดรูปแบบวันที่ของแม่แบบ Django นั้นง่ายและรวดเร็ว มันตัดค่าศูนย์นำหน้า หากคุณไม่ต้องการนำเข้าโมดูล Django ลองดูสิ

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

โปรดทราบว่าถ้าคุณเป็นเหมือนฉันและคุณไม่ได้สร้างแอปของคุณใน django คุณจะต้องบอก django ว่าคุณไม่จำเป็นต้องกำหนดค่า:import django.conf django.conf.settings.configure()
Alex Pretzlav

8

ดูที่การ-ร้อง:

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

ทำงานได้อย่างสมบูรณ์แบบใน python 3
Saurabh

นี่ควรเป็นคำตอบที่ยอมรับได้ ทำในสิ่งที่ถูกถามง่าย ๆ และจดจำได้ง่าย เรียกดูเอกสารอย่างรวดเร็วฉันไม่สามารถค้นหาข้อมูลนี้ได้
Lucas Lima

1
"นี่ควรเป็นคำตอบที่ยอมรับ" ไม่ควรไม่เช่นนี้ใช้ได้กับ Linux เท่านั้น
user136036


3

สำหรับ%dคุณสามารถแปลงเป็นจำนวนเต็มโดยใช้int()มันจะลบ 0 นำหน้าและกลายเป็นจำนวนเต็มโดยอัตโนมัติ str()จากนั้นคุณสามารถแปลงกลับไปใช้สตริง


2
คำถาม OP เป็นวิธีการแก้ปัญหาโดยใช้ระบุรูปแบบในการเรียก strftime มากกว่าวิธีการแก้ปัญหาที่เกี่ยวข้องกับ STR ม้วนของคุณเอง ()
เดฟฮูเปอร์

คำตอบที่ดีไม่ฟัง dave Hooper
Toskan

3

ตัวอย่างเช่นการใช้ "% -d" ไม่สามารถพกพาได้แม้ระหว่างเวอร์ชั่นต่าง ๆ ของระบบปฏิบัติการเดียวกัน ทางออกที่ดีกว่าคือการแยกส่วนประกอบวันที่แยกกันและเลือกระหว่างตัวดำเนินการจัดรูปแบบเฉพาะวันที่และเข้าถึงแอตทริบิวต์วันที่สำหรับแต่ละองค์ประกอบ

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

เนื่องจาก Python เพียงแค่เรียกใช้strftime(3)ฟังก์ชั่นภาษา C บนแพลตฟอร์มของคุณอาจเป็นได้ว่ามีอักขระรูปแบบที่คุณสามารถใช้เพื่อควบคุมศูนย์นำหน้า ลองman strftimeดู แต่แน่นอนผลลัพธ์จะไม่สามารถพกพาได้เนื่องจากคู่มือ Python จะเตือนคุณ :-)

ฉันจะลองใช้datetimeอ็อบเจกต์สไตล์ใหม่แทนซึ่งมีคุณสมบัติเช่นt.yearและt.monthและt.dayวางสิ่งเหล่านี้ผ่านการจัดรูปแบบปกติที่ใช้พลังงานสูงของ%โอเปอเรเตอร์ซึ่งรองรับการควบคุมศูนย์นำหน้า ดูhttp://docs.python.org/library/datetime.htmlเพื่อดูรายละเอียด ยังดีกว่าใช้"".format()โอเปอเรเตอร์ถ้า Python ของคุณมีและทันสมัยกว่าเดิม มันมีตัวเลือกรูปแบบมากมายสำหรับตัวเลขเช่นกัน ดู: http://docs.python.org/library/string.html#string-formatting


2

ตามวิธีของ Alex สิ่งนี้จะใช้ได้กับทั้งกรณีเริ่มต้นของสตริงและช่องว่างหลัง:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

ฉันชอบสิ่งนี้ดีกว่า. format หรือ% -d เพราะเป็น cross-platform และทำให้ฉันยังคงใช้ strftime (เพื่อให้ได้สิ่งต่าง ๆ เช่น "พฤศจิกายน" และ "Monday")


1

คำถามเก่า แต่% l (ตัวพิมพ์เล็ก) ทำงานให้ฉันในเวลาไม่นาน: นี่อาจไม่ได้ผลสำหรับทุกคนเพราะมันไม่อยู่ในรายการในเอกสารของ Python ที่ฉันพบ


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

สิ่งนี้แทนที่ศูนย์ชั้นนำด้วยช่องว่างซึ่งไม่ใช่สิ่งที่ OP ขอ
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'ใช้ python 3.5
ji-ruh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.