2016-05-23 41 views
9

Tôi đang cố gắng tìm ngày đầu tiên của tháng trong python với một điều kiện là nếu ngày hiện tại của tôi đã trôi qua ngày 25 của tháng thì biến ngày đầu tiên sẽ giữ ngày đầu tiên của tháng tiếp theo thay vì tháng hiện tại. Tôi đang làm như sau:tìm ngày đầu tiên của tháng trong python

import datetime 
todayDate = datetime.date.today() 
if (todayDate - todayDate.replace(day=1)).days > 25: 
    x= todayDate + datetime.timedelta(30) 
    x.replace(day=1) 
    print x 
else: 
    print todayDate.replace(day=1) 

có cách nào khác để làm việc này không?

Cảm ơn trước!

+1

Btw, kiểm tra của bạn 'todayDate - todayDate.replace (ngày = 1)) ngày> 25' chỉ trở thành sự thật vào ngày 27, không phải là. Ngày 26 Bạn có muốn làm những gì bạn nói trong lời nói, hoặc những gì bạn nói trong mã? –

+0

Và có vẻ như với tôi rằng bạn có thể gặp vấn đề trong những ngày cuối tháng Hai. – Matthias

Trả lời

18

Đây là giải pháp tốt.

import datetime 

todayDate = datetime.date.today() 
if todayDate.day > 25: 
    todayDate += datetime.timedelta(7) 
print todayDate.replace(day=1) 

Một điều cần lưu ý với các ví dụ mã ban đầu là sử dụng timedelta(30)sẽ gây troubl e nếu bạn đang thử nghiệm ngày cuối cùng của tháng Giêng. Đó là lý do tại sao tôi đang sử dụng một đồng bằng 7 ngày.

+0

Bạn đúng @ J.F.Sebastian! Điều đó thậm chí còn nhỏ hơn, vì vậy tôi đã thực hiện thay đổi được đề xuất của bạn. – andrew

+0

cảm ơn @andrew: nó cũng giúp tôi .. :) – Harsha

2

Sử dụng dateutil.

from datetime import date 
from dateutil.relativedelta import relativedelta 

today = date.today() 
first_day = today.replace(day=1) 
if today.day > 25: 
    print(first_day + relativedelta(months=1)) 
else: 
    print(first_day) 
1

Có, trước tiên hãy đặt ngày giờ bắt đầu tháng hiện tại.

Kiểm tra thứ hai nếu ngày hiện tại> 25 và nhận được đúng/sai về điều đó. Nếu True thì thêm một tháng vào ngày bắt đầu của đối tượng datetime tháng. Nếu sai thì sử dụng đối tượng datetime với giá trị được đặt vào đầu tháng.

import datetime 
from dateutil.relativedelta import relativedelta 

todayDate = datetime.date.today() 
resultDate = todayDate.replace(day=1) 

if ((todayDate - resultDate).days > 25): 
    resultDate = resultDate + relativedelta(months=1) 

print resultDate 
1

Các arrow mô-đun sẽ hướng bạn xung quanh và tránh xa những sai lầm tinh vi và dễ dàng hơn khi sử dụng các sản phẩm cũ hơn đó.

import arrow 

def cleanWay(oneDate): 
    if currentDate.date().day > 25: 
     return currentDate.replace(months=+1,day=1) 
    else: 
     return currentDate.replace(day=1) 


currentDate = arrow.get('25-Feb-2017', 'DD-MMM-YYYY') 
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY')) 

currentDate = arrow.get('28-Feb-2017', 'DD-MMM-YYYY') 
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY')) 

Trong trường hợp này, bạn không cần xem xét các độ dài khác nhau của tháng chẳng hạn. Đây là đầu ra từ tập lệnh này.

25-Feb-2017 01-Feb-2017 
28-Feb-2017 01-Mar-2017 
33

có thể được thực hiện trên cùng một dòng

datetime.date.today().replace(day=1) 
Các vấn đề liên quan