วิธีเปรียบเทียบสองวัน


380

ฉันจะเปรียบเทียบวันที่สองวันเพื่อดูว่าเป็นวันใดหลังจากนั้นโดยใช้ Python

ตัวอย่างเช่นฉันต้องการตรวจสอบว่าวันที่ปัจจุบันเกินกว่าวันที่สุดท้ายในรายการนี้ที่ฉันกำลังสร้างซึ่งเป็นวันที่วันหยุดเพื่อที่จะส่งอีเมลโดยอัตโนมัติแจ้งให้ผู้ดูแลระบบอัปเดตไฟล์ holiday.txt


20
เอ่อคุณใช้<และ>โอเปอเรเตอร์เหมือนกับการเปรียบเทียบอื่น ๆ
Daniel Roseman

12
@JohnMachin: คุณเขียนฟังก์ชั่นที่มีต้นแบบสร้างint compare_dates(void const *, void const*)ทั้งอาร์กิวเมนต์struct Date *และใช้ตรรกะการเปรียบเทียบ อาจไม่ชัดเจนว่าเป็นผู้ใช้ใหม่ของ Python
Fred Foo

1
@larsmans: ขออภัย .... s / any_language / any_reasonable_language / และทุกคนที่เคยใช้ภาษาที่ไม่มีเหตุผลควรใช้เวลาสองสามนาทีเพื่ออ่านเอกสารและลองวันที่ 1 <วันที่ 2
จอห์น

2
docs.python.org/library/datetime.html#datetime-objects ค้นหา Ctrl-F สำหรับ "การทำงานที่รองรับ"
John Machin

1
@Galaxy - เขาใช้การเปรียบเทียบเพื่อแสดงให้เห็นว่าสิ่งที่ควรเป็นเรื่องง่ายสำหรับคนที่มีประสบการณ์อาจไม่ง่ายสำหรับผู้เริ่มต้นทั้งหมดและเขาใช้ C เพื่ออธิบายสิ่งนี้ เขาไม่คิดว่าคำถามนั้นเกี่ยวกับ C. และเขาพูดถูกฉันเป็นผู้เริ่มต้นทั้งหมดเมื่อฉันถามคำถามนี้เมื่อ 8 ปีที่แล้วและไม่มีเงื่อนงำว่ามันทำงานอย่างไร
เซซิล Rodriguez

คำตอบ:


495

ใช้datetimeวิธีการและผู้ประกอบการ<และเครือญาติ

>>> from datetime import datetime, timedelta
>>> past = datetime.now() - timedelta(days=1)
>>> present = datetime.now()
>>> past < present
True
>>> datetime(3000, 1, 1) < present
False
>>> present - datetime(2000, 4, 4)
datetime.timedelta(4242, 75703, 762105)

19
วิธีนี้ใช้สำหรับค่าที่ทราบเขตเวลาด้วยหากใครสงสัย
Mat Gessel

2
ความแตกต่างระหว่างpastและpresentคืออะไร ฉันไม่เข้าใจตัวอย่างของคุณและผลลัพธ์ของมันก็ไม่สมเหตุสมผล
Emadpres

19
@Emadpres: จินตนาการว่าพิมพ์ด้วยตนเอง บรรทัดที่ผ่านมาถูกพิมพ์ครั้งแรกในขณะที่บรรทัดปัจจุบันถูกพิมพ์ที่สอง ... ดังนั้นบรรทัดที่ผ่านมาจะถูกป้อนก่อนดังนั้นที่ผ่านมา <ปัจจุบันเป็นจริง
ramcdougal

2
การอ้างถึงจาก doc: "ถ้ามีการเปรียบเทียบอันใดอันหนึ่งไร้เดียงสาและอีกอันหนึ่งรู้ตัว TypeError จะถูกยกขึ้นหากมีการพยายามเปรียบเทียบลำดับสำหรับการเปรียบเทียบความเท่าเทียมกันอินสแตนซ์ไร้เดียงสาจะไม่เท่ากับอินสแตนซ์ที่รับรู้ แอ็ตทริบิวต์ tzinfo, แอ็ตทริบิวต์ tzinfo ทั่วไปจะถูกละเว้นและเปรียบเทียบ datetimes พื้นฐานหากทั้งสองการเปรียบเทียบทราบและมีแอตทริบิวต์ tzinfo ที่แตกต่างกันการเปรียบเทียบจะถูกปรับก่อนโดยการลบออฟเซ็ต UTC (รับจาก self.utcoffset ()) "
Vikas Prasad

2
ชื่อตัวแปรที่ควรจะเป็นและpast past_but_a_little_afterเทคนิคpresentนี้ยังมีในอดีตเมื่อเปรียบเทียบpast < presentจะทำ
grisaitis

75

ใช้ time

สมมติว่าคุณมีวันที่เริ่มต้นเป็นสตริงเช่นนี้
date1 = "31/12/2015"
date2 = "01/01/2016"

คุณสามารถทำสิ่งต่อไปนี้
newdate1 = time.strptime(date1, "%d/%m/%Y")และnewdate2 = time.strptime(date2, "%d/%m/%Y")แปลงเป็นรูปแบบวันที่ของไพ ธ อน จากนั้นการเปรียบเทียบจะชัดเจน:

newdate1 > newdate2จะกลับมาFalse
newdate1 < newdate2จะกลับมาTrue


40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)Trueจะกลับมา

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)datetime.timedelta(-1)จะกลับมา

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)datetime.timedelta(1)จะกลับมา

ดูเอกสาร


3

คำตอบอื่น ๆ ที่ใช้datetimeและการเปรียบเทียบยังใช้ได้เฉพาะเวลาโดยไม่มีวันที่

ตัวอย่างเช่นเพื่อตรวจสอบว่าตอนนี้มันเป็นมากหรือน้อยกว่า 8:00 น. เราสามารถใช้:

import datetime

eight_am = datetime.time( 8,0,0 ) # Time, without a date

และเปรียบเทียบกับ:

datetime.datetime.now().time() > eight_am  

ซึ่งจะกลับมา True


-1

สำหรับการคำนวณวันที่แตกต่างกันสองวันสามารถทำได้ดังนี้:

import datetime
import math

issuedate = datetime(2019,5,9)   #calculate the issue datetime
current_date = datetime.datetime.now() #calculate the current datetime
diff_date = current_date - issuedate #//calculate the date difference with time also
amount = fine  #you want change

if diff_date.total_seconds() > 0.0:   #its matching your condition
    days = math.ceil(diff_date.total_seconds()/86400)  #calculate days (in 
    one day 86400 seconds)
    deductable_amount = round(amount,2)*days #calclulated fine for all days

กลายเป็นถ้าหนึ่งวินาทีมากขึ้นด้วยวันที่ครบกำหนดแล้วเราจะต้องเรียกเก็บเงิน


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