2013-08-25 43 views
5

Tôi là một lập trình viên python tân binh và tôi cần viết kịch bản để kiểm tra xem một ngày cụ thể (được chuyển thành chuỗi trong biểu mẫu 'Tháng, ngày năm') là thứ Sáu thứ ba của tháng. Tôi đang sử dụng Python 2.7.Python: Thứ Sáu thứ ba của tháng

Ví dụ: những ngày này có thể giúp bạn hiểu rõ hơn về sự cố của mình. Có một lịch hàng năm ở bàn tay.

  • đầu vào ---> đầu ra
  • 'ngày 18 tháng một năm 2013' ---> Đúng
  • '22 Tháng hai 2013' ---> False
  • 'Tháng Sáu 21, 2013 '---> Đúng
  • '20 Tháng Chín năm 2013' ---> Đúng

tôi chỉ muốn sử dụng các lớp học tiêu chuẩn được cung cấp bởi các ngôn ngữ, giống như thời gian, datetime, lịch, vv

Tôi đã xem xét một số câu trả lời nhưng tôi thấy các tính toán như cộng thêm/substracting 86400 giây cho mỗi ngày hoặc thậm chí so sánh tùy thuộc vào số ngày mà tháng đó có. IMHO đây là sai bởi vì các libreries trong Python đã chăm sóc những chi tiết này vì vậy không cần phải tái tạo lại bánh xe. Ngoài ra lịch và ngày tháng rất phức tạp: năm nhuận, giây nhảy vọt, múi giờ, số tuần, v.v. vì vậy tôi nghĩ tốt hơn là để các thư viện giải quyết những chi tiết phức tạp này.

Cảm ơn trước sự giúp đỡ của bạn.

+0

Ngày đầu vào có luôn là thứ Sáu không? –

+0

đầu vào là ngẫu nhiên và anh ta muốn kiểm tra xem ngày đầu vào là thứ sáu thứ sáu của tháng – Hardy

+0

Đầu vào của bạn có luôn ở dạng "Mmm dd, YYYY" không? Nếu vậy, làm thế nào bạn có thể chia chuỗi đó để đưa tháng, ngày và năm vào các biến riêng biệt? Làm thế nào bạn sẽ vượt qua chúng vào thư viện để có được một đối tượng có thông tin như ngày trong tuần? – chrylis

Trả lời

15

này nên làm điều đó:

from datetime import datetime 

def is_third_friday(s): 
    d = datetime.strptime(s, '%b %d, %Y') 
    return d.weekday() == 4 and 14 < d.day < 22 

Test:

print is_third_friday('Jan 18, 2013') # True 
print is_third_friday('Feb 22, 2013') # False 
print is_third_friday('Jun 21, 2013') # True 
print is_third_friday('Sep 20, 2013') # True 
+0

cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Câu trả lời thực sự thông minh và ngắn gọn. Tôi đã không nhận ra nó và giải pháp của tôi phức tạp hơn !! –

+1

Bạn có thể giải thích về cách bạn chọn ngày cho '14

+3

@MichaelMolter trong 7 ngày đầu tiên phải có ngày thứ Sáu. Vì vậy, thứ sáu đầu tiên là một nơi nào đó từ 1 đến 7, có nghĩa là (thêm 14) thứ sáu thứ ba là bất cứ nơi nào 15-21. –

2

bạn có thể sử dụng một cái gì đó như thế này để có được fridday thứ ba của tháng (tháng hiện tại), và sau đó chỉ cần so sánh rằng third_friday với ngày của bạn (theo năm, tháng, ngày)

from datetime import datetime, timedelta 
import calendar 

now = datetime.now() 
first_day_of_month = datetime(now.year, now.month, 1) 
first_friday = first_day_of_month + timedelta(days=((4-calendar.monthrange(now.year,now.month)[0])+7)%7) 
# 4 is friday of week 
third_friday = first_friday + timedelta(days=14) 

Hy vọng điều này sẽ hữu ích.

+1

Cảm ơn sự giúp đỡ của bạn. Tôi bỏ phiếu cho giải pháp @elyase. –

1

Nếu bạn đang cố gắng tìm hết một option, bạn có thể sử dụng giống như

from datetime import datetime 
import calendar 

def option_expiration(date): 
    day = 21 - (calendar.weekday(date.year, date.month, 1) + 2) % 7 
    return datetime(date.year, date.month, day) 

print option_expiration(datetime.today()) 
2

Tuy nhiên, một cách khác này để thực hiện điều này ... sử dụng phân chia số nguyên ...

import datetime 

def is_date_the_nth_friday_of_month(nth, date=None): 
    #nth is an integer representing the nth weekday of the month 
    #date is a datetime.datetime object, which you can create by doing datetime.datetime(2016,1,11) for January 11th, 2016 

    if not date: 
     #if date is None, then use today as the date 
     date = datetime.datetime.today() 

    if date.weekday() == 4: 
     #if the weekday of date is Friday, then see if it is the nth Friday 
     if (date.day - 1) // 7 == (nth - 1): 
      #We use integer division to determine the nth Friday 
      #if this integer division == 0, then date is the first Friday, 
      # if the integer division is... 
      # 1 == 2nd Friday 
      # 2 == 3rd Friday 
      # 3 == 4th Friday 
      # 4 == 5th Friday 
      return True 

    return False