เมื่อใช้ Python strftime
จะมีวิธีการลบ 0 แรกของวันที่ถ้ามันอยู่ก่อนวันที่ 10 นั่นคือ เพื่อให้01
เป็น1
? ไม่พบสิ่ง%
ที่ใช่หรือไม่
ขอบคุณ!
เมื่อใช้ Python strftime
จะมีวิธีการลบ 0 แรกของวันที่ถ้ามันอยู่ก่อนวันที่ 10 นั่นคือ เพื่อให้01
เป็น1
? ไม่พบสิ่ง%
ที่ใช่หรือไม่
ขอบคุณ!
คำตอบ:
ที่จริงฉันมีปัญหาเดียวกันและฉันรู้ว่าถ้าคุณเพิ่มยัติภังค์ระหว่าง%
และตัวอักษรคุณสามารถลบศูนย์นำ
%Y/%-m/%-d
เช่น
ใช้งานได้กับ Unix (Linux, OS X) เท่านั้นไม่ใช่ Windows (รวมถึง Cygwin) ใน Windows คุณจะใช้เช่น#
%Y/%#m/%#d
ValueError: '-' is a bad directive in format '%b %-d, %Y'
ฉันได้รับ OSX, Python 2.7
%#d
จะทำเช่นเดียวกันใน Windows
เราสามารถทำสิ่งนี้กับการกำเนิดของ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'
time.strftime('%A %B %d, %Y')
ซึ่งอัตราผลตอบแทน Tuesday October 07, 2014
(ตอนนี้อยู่กับสถานที่เป็นภาษาอังกฤษ)
__format__
เบ็ดที่น่าสนใจมากที่ช่วยให้คุณเขียนสิ่งเช่นนั้น
'{dt.hour}'
ใช้นาฬิกา 24 ชั่วโมง :( การใช้ตัวเลือกที่สองยังคงนำคุณกลับไปใช้'{%#I}'
บน Windows และ'{%-I}'
Unix
บางแพลตฟอร์มอาจรองรับข้อกำหนดความกว้างและความแม่นยำระหว่าง%
และตัวอักษร (เช่น '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'
นี่คือเอกสารของตัวดัดแปลงที่สนับสนุนโดยstrftime()
ในไลบรารี GNU C (เหมือนที่คนอื่นพูดไว้ก่อนหน้านี้มันอาจจะไม่พกพาได้) ที่คุณอาจสนใจ:
%e
แทนที่จะเป็นการ%d
แทนที่ศูนย์นำในวันที่ของเดือนด้วยช่องว่างมันทำงานได้บน Python ของฉัน (บน Linux) ฉันไม่รู้ว่ามันจะทำงานกับคุณหรือไม่
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
.replace('X0','X').replace('X','')
คืออะไร? แค่ทำ.replace('X0', '')
แล้วมันจะดี
บน Windows ให้เพิ่ม '#' ดังเช่นใน '% # m /% # d /% Y% # I:% M:% S% p'
สำหรับการอ้างอิง: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
ค่อนข้างช้าไปงานปาร์ตี้ แต่ใช้%-d
งานได้ที่ปลาย
datetime.now().strftime('%B %-d, %Y')
ผลิตสิ่งที่ต้องการ "5 พฤศจิกายน 2014"
ไชโย :)
ValueError: Invalid format string
ในระบบ Windows ของฉัน
ฉันพบว่าตัวกรองการจัดรูปแบบวันที่ของแม่แบบ 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')
import django.conf
django.conf.settings.configure()
ดูที่การ-
ร้อง:
>>> 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)
ใช้replace
แบบนี้:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
มันจะเอาท์พุท:
'2017/7/21'
สำหรับ%d
คุณสามารถแปลงเป็นจำนวนเต็มโดยใช้int()
มันจะลบ 0 นำหน้าและกลายเป็นจำนวนเต็มโดยอัตโนมัติ str()
จากนั้นคุณสามารถแปลงกลับไปใช้สตริง
ตัวอย่างเช่นการใช้ "% -d" ไม่สามารถพกพาได้แม้ระหว่างเวอร์ชั่นต่าง ๆ ของระบบปฏิบัติการเดียวกัน ทางออกที่ดีกว่าคือการแยกส่วนประกอบวันที่แยกกันและเลือกระหว่างตัวดำเนินการจัดรูปแบบเฉพาะวันที่และเข้าถึงแอตทริบิวต์วันที่สำหรับแต่ละองค์ประกอบ
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
เนื่องจาก 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
ตามวิธีของ Alex สิ่งนี้จะใช้ได้กับทั้งกรณีเริ่มต้นของสตริงและช่องว่างหลัง:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
ฉันชอบสิ่งนี้ดีกว่า. format หรือ% -d เพราะเป็น cross-platform และทำให้ฉันยังคงใช้ strftime (เพื่อให้ได้สิ่งต่าง ๆ เช่น "พฤศจิกายน" และ "Monday")
คำถามเก่า แต่% l (ตัวพิมพ์เล็ก) ทำงานให้ฉันในเวลาไม่นาน: นี่อาจไม่ได้ผลสำหรับทุกคนเพราะมันไม่อยู่ในรายการในเอกสารของ Python ที่ฉันพบ
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'
ใช้ python 3.5