簡體   English   中英

如何覆蓋datetime.now()對象

[英]How to overwrite a datetime.now() object

我正在嘗試實現一個get_date函數,我想用它來構建更高級的函數(例如, get_payment_date給出的get_payment_date )。 這是我的代碼:

from datetime import datetime

def get_date(year=None, month=None, day=None):
    '''Returns now, with the given parts overwritten'''
    dt = datetime.now()
    if not year  is None : dt.year  = year
    if not month is None : dt.month = month
    if not day   is None : dt.day   = day
    return dt

def get_payment_date():
    return get_date(day=15)

print get_payment_date()

但如果失敗了:

AttributeError: attribute 'day' of 'datetime.date' objects is not writable

我知道了。 我怎么解決這個問題? 我怎樣才能“覆蓋” now某些部分?

datetime.datetimedatetime.date對象是不可變的。

您可以執行dt = dt.replace(year = year)來獲取基於舊日期對象的新日期時間對象。

你不一定要這樣做三次,但這樣的事情可能適合你:

def get_date(**kwargs):
    '''Returns now, with the given parts overwritten'''
    dt = datetime.now()
    # optionally, depending on intended use of this function
    kwargs = { k : v for k,v in kwargs.items() if v is not None }
    return dt.replace(**kwargs)

這就是我想要的(感謝Steve Jessop):

from datetime import datetime

def get_date(year=None, month=None, day=None):
    '''Returns now, with the given parts overwritten'''
    dt = datetime.now()
    kwargs = {}
    if year  : kwargs['year']  = year
    if month : kwargs['month'] = month
    if day   : kwargs['day'] = day
    if kwargs : return dt.replace(**kwargs)
    else      : return dt

def get_payment_date():
    return get_date(day=15)

print get_payment_date()

請注意,我需要構建一個kwargs因為dt.replace不接受None作為year / month / day 另外,我刪除is not None檢查,因為0值也意味着沒有替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM