ทำไม: วันที่เป็นวัตถุ
ใน Python วันที่เป็นวัตถุ ดังนั้นเมื่อคุณจัดการพวกเขาคุณจัดการกับวัตถุไม่ใช่สายอักขระไม่ประทับเวลาหรืออะไร
วัตถุใด ๆ ใน Python มีการแทนค่าสตริงที่สอง:
การแสดงปกติที่ใช้โดย "พิมพ์" สามารถใช้str()
ฟังก์ชั่นได้ เป็นรูปแบบที่มนุษย์ใช้บ่อยที่สุดที่อ่านได้ง่ายและถูกใช้เพื่อความสะดวกในการแสดงผล ดังนั้นจะช่วยให้คุณstr(datetime.datetime(2008, 11, 22, 19, 53, 42))
'2008-11-22 19:53:42'
การเป็นตัวแทนทางเลือกที่ใช้เพื่อแสดงธรรมชาติของวัตถุ (เป็นข้อมูล) มันสามารถใช้งานrepr()
ฟังก์ชั่นนี้ได้และมีประโยชน์ที่จะรู้ว่าคุณกำลังจัดการกับข้อมูลชนิดใดในขณะที่คุณกำลังพัฒนาหรือแก้ไขข้อบกพร่อง จะช่วยให้คุณrepr(datetime.datetime(2008, 11, 22, 19, 53, 42))
'datetime.datetime(2008, 11, 22, 19, 53, 42)'
สิ่งที่เกิดขึ้นคือเมื่อคุณพิมพ์วันที่โดยใช้ "print" มันจะใช้str()
เพื่อให้คุณเห็นสตริงวันที่ที่ดี แต่เมื่อคุณได้พิมพ์mylist
ที่คุณได้พิมพ์รายชื่อของวัตถุและ Python repr()
พยายามที่จะเป็นตัวแทนของชุดของข้อมูลที่ใช้
วิธีการ: คุณต้องการทำอะไรกับสิ่งนั้น
เมื่อคุณจัดการวันที่ให้ใช้วัตถุวันที่ตลอดทาง พวกเขามีวิธีการที่มีประโยชน์หลายพันวิธีและ Python API ส่วนใหญ่คาดว่าวันที่จะเป็นวัตถุ
str()
เมื่อคุณต้องการที่จะแสดงให้พวกเขาเพียงแค่ใช้ ใน Python วิธีปฏิบัติที่ดีคือการโยนทุกอย่างอย่างชัดเจน str(date)
ดังนั้นเพียงแค่เมื่อมันถึงเวลาที่จะพิมพ์ได้รับการแสดงสตริงวันของคุณโดยใช้
สิ่งสุดท้าย. เมื่อคุณพยายามพิมพ์วันที่คุณพิมพ์ออกmylist
มา หากคุณต้องการพิมพ์วันที่คุณต้องพิมพ์วัตถุวันที่ไม่ใช่คอนเทนเนอร์ (รายการ)
EG คุณต้องการพิมพ์วันที่ทั้งหมดในรายการ:
for date in mylist :
print str(date)
โปรดทราบว่าในกรณีเฉพาะนั้นคุณสามารถละเว้นได้str()
เนื่องจากการพิมพ์จะใช้สำหรับคุณ แต่มันไม่ควรกลายเป็นนิสัย :-)
กรณีปฏิบัติโดยใช้รหัสของคุณ
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22
# It's better to always use str() because :
print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22
print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects
print "This is a new day : " + str(mylist[0])
>>> This is a new day : 2008-11-22
การจัดรูปแบบวันที่ขั้นสูง
วันที่มีการแสดงเริ่มต้น แต่คุณอาจต้องการพิมพ์ในรูปแบบเฉพาะ ในกรณีนี้คุณสามารถรับการแทนค่าสตริงที่กำหนดเองโดยใช้strftime()
วิธีการ
strftime()
คาดหวังรูปแบบสตริงที่อธิบายวิธีที่คุณต้องการจัดรูปแบบวันที่ของคุณ
เช่น :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
ตัวอักษรทั้งหมดหลังจาก"%"
แสดงรูปแบบสำหรับบางสิ่ง:
%d
คือหมายเลขวัน
%m
คือหมายเลขเดือน
%b
เป็นตัวย่อของเดือน
%y
เป็นปีที่สองหลักสุดท้าย
%Y
คือตลอดทั้งปี
ฯลฯ
ดูเอกสารอย่างเป็นทางการหรือการอ้างอิงอย่างรวดเร็วของ McCutchen ที่คุณไม่สามารถรู้ได้ทั้งหมด
ตั้งแต่PEP3101ทุกวัตถุสามารถมีรูปแบบของตัวเองที่ใช้โดยอัตโนมัติตามรูปแบบวิธีการของสตริงใด ๆ ในกรณีของวันที่และเวลารูปแบบจะเหมือนกันที่ใช้ใน strftime ดังนั้นคุณสามารถทำเช่นเดียวกับข้างต้นเช่นนี้:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
ข้อดีของแบบฟอร์มนี้คือคุณสามารถแปลงวัตถุอื่น ๆ ได้ในเวลาเดียวกัน
ด้วยการแนะนำตัวอักษรสตริงที่จัดรูปแบบ (ตั้งแต่ Python 3.6, 2016-12-23) สิ่งนี้สามารถเขียนเป็น
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
การ จำกัด
วันที่สามารถปรับให้เข้ากับภาษาและวัฒนธรรมท้องถิ่นโดยอัตโนมัติหากคุณใช้วิธีที่ถูกต้อง แต่มันค่อนข้างซับซ้อน อาจเป็นคำถามอื่นใน SO (Stack Overflow) ;-)
str()
(กับแต่ละองค์ประกอบของรายการ) เพราะนั่นเป็นสิ่งที่print
ทำกับtoday
วัตถุเดี่ยวของคุณโดยปริยาย