简体   繁体   English

如何覆盖datetime.now()对象

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

I am trying to implement a get_date function which I want to use to build higher-level functions (for example, get_payment_date given below). 我正在尝试实现一个get_date函数,我想用它来构建更高级的函数(例如, get_payment_date给出的get_payment_date )。 This is my code: 这是我的代码:

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()

But if fails: 但如果失败了:

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

I get it. 我知道了。 How can I solve this? 我怎么解决这个问题? How can I "overwrite" only some parts of now ? 我怎样才能“覆盖” now某些部分?

datetime.datetime and datetime.date objects are immutable. datetime.datetimedatetime.date对象是不可变的。

You can do dt = dt.replace(year = year) to get a new datetime object based on an old one. 您可以执行dt = dt.replace(year = year)来获取基于旧日期对象的新日期时间对象。

You don't necessarily want to do that three times, but something like this might suit you: 你不一定要这样做三次,但这样的事情可能适合你:

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)

This is what I wanted (thanks to Steve Jessop): 这就是我想要的(感谢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()

Notice that I need to build a kwargs since dt.replace does not accept None as value for year / month / day . 请注意,我需要构建一个kwargs因为dt.replace不接受None作为year / month / day Also, I removed is not None check, since a 0 value means also no replacement. 另外,我删除is not None检查,因为0值也意味着没有替换。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM