How to overwrite datetime.now () object

I am trying to implement a function get_datethat I want to use to create higher level functions (like get_payment_datethe ones below). 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 the failure:

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

I understand. How can i solve this? How can I “rewrite” only some parts now?

+4
source share
2 answers

datetime.datetimeand datetime.dateobjects are immutable.

You can do dt = dt.replace(year = year)to get a new datetime object based on the old.

You don't necessarily want to do this three times, but you might like something like this:

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)
+7
source

This is what I wanted (thanks to 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 check, 0 .

+1

All Articles