Home | History | Annotate | Download | only in docs
      1 =============
      2 relativedelta
      3 =============
      4 .. automodule:: dateutil.relativedelta
      5    :members:
      6    :undoc-members:
      7 
      8 .. testsetup:: relativedelta
      9 
     10 Examples
     11 --------
     12 
     13     >>> from datetime import *; from dateutil.relativedelta import *
     14     >>> import calendar
     15     >>> NOW = datetime(2003, 9, 17, 20, 54, 47, 282310)
     16     >>> TODAY = date(2003, 9, 17)
     17 
     18 Let's begin our trip::
     19 
     20     >>> from datetime import *; from dateutil.relativedelta import *
     21     >>> import calendar
     22 
     23 Store some values::
     24 
     25     >>> NOW = datetime.now()
     26     >>> TODAY = date.today()
     27     >>> NOW
     28     datetime.datetime(2003, 9, 17, 20, 54, 47, 282310)
     29     >>> TODAY
     30     datetime.date(2003, 9, 17)
     31 
     32 Next month
     33 
     34 .. doctest:: relativedelta
     35 
     36     >>> NOW+relativedelta(months=+1)
     37     datetime.datetime(2003, 10, 17, 20, 54, 47, 282310)
     38 
     39 Next month, plus one week.
     40 
     41 .. doctest:: relativedelta
     42 
     43     >>> NOW+relativedelta(months=+1, weeks=+1)
     44     datetime.datetime(2003, 10, 24, 20, 54, 47, 282310)
     45 
     46 Next month, plus one week, at 10am.
     47 
     48 .. doctest:: relativedelta
     49 
     50     >>> TODAY+relativedelta(months=+1, weeks=+1, hour=10)
     51     datetime.datetime(2003, 10, 24, 10, 0)
     52 
     53 Here is another example using an absolute relativedelta.  Notice the use of
     54 year and month (both singular) which causes the values to be *replaced* in the
     55 original datetime rather than performing an arithmetic operation on them.
     56 
     57 .. doctest:: relativedelta
     58 
     59     >>> NOW+relativedelta(year=1, month=1)
     60     datetime.datetime(1, 1, 17, 20, 54, 47, 282310)
     61 
     62 Let's try the other way around. Notice that the
     63 hour setting we get in the relativedelta is relative,
     64 since it's a difference, and the weeks parameter
     65 has gone.
     66 
     67 .. doctest:: relativedelta
     68 
     69     >>> relativedelta(datetime(2003, 10, 24, 10, 0), TODAY)
     70     relativedelta(months=+1, days=+7, hours=+10)
     71 
     72 One month before one year.
     73 
     74 .. doctest:: relativedelta
     75 
     76     >>> NOW+relativedelta(years=+1, months=-1)
     77     datetime.datetime(2004, 8, 17, 20, 54, 47, 282310)
     78 
     79 How does it handle months with different numbers of days?
     80 Notice that adding one month will never cross the month
     81 boundary.
     82 
     83 .. doctest:: relativedelta
     84 
     85     >>> date(2003,1,27)+relativedelta(months=+1)
     86     datetime.date(2003, 2, 27)
     87     >>> date(2003,1,31)+relativedelta(months=+1)
     88     datetime.date(2003, 2, 28)
     89     >>> date(2003,1,31)+relativedelta(months=+2)
     90     datetime.date(2003, 3, 31)
     91 
     92 The logic for years is the same, even on leap years.
     93 
     94 .. doctest:: relativedelta
     95 
     96     >>> date(2000,2,28)+relativedelta(years=+1)
     97     datetime.date(2001, 2, 28)
     98     >>> date(2000,2,29)+relativedelta(years=+1)
     99     datetime.date(2001, 2, 28)
    100 
    101     >>> date(1999,2,28)+relativedelta(years=+1)
    102     datetime.date(2000, 2, 28)
    103     >>> date(1999,3,1)+relativedelta(years=+1)
    104     datetime.date(2000, 3, 1)
    105 
    106     >>> date(2001,2,28)+relativedelta(years=-1)
    107     datetime.date(2000, 2, 28)
    108     >>> date(2001,3,1)+relativedelta(years=-1)
    109     datetime.date(2000, 3, 1)
    110 
    111 Next friday
    112 
    113 .. doctest:: relativedelta
    114 
    115     >>> TODAY+relativedelta(weekday=FR)
    116     datetime.date(2003, 9, 19)
    117 
    118     >>> TODAY+relativedelta(weekday=calendar.FRIDAY)
    119     datetime.date(2003, 9, 19)
    120 
    121 Last friday in this month.
    122 
    123 .. doctest:: relativedelta
    124 
    125     >>> TODAY+relativedelta(day=31, weekday=FR(-1))
    126     datetime.date(2003, 9, 26)
    127 
    128 Next wednesday (it's today!).
    129 
    130 .. doctest:: relativedelta
    131 
    132     >>> TODAY+relativedelta(weekday=WE(+1))
    133     datetime.date(2003, 9, 17)
    134 
    135 Next wednesday, but not today.
    136 
    137 .. doctest:: relativedelta
    138 
    139     >>> TODAY+relativedelta(days=+1, weekday=WE(+1))
    140     datetime.date(2003, 9, 24)
    141 
    142 Following
    143 [http://www.cl.cam.ac.uk/~mgk25/iso-time.html ISO year week number notation]
    144 find the first day of the 15th week of 1997.
    145 
    146 .. doctest:: relativedelta
    147 
    148     >>> datetime(1997,1,1)+relativedelta(day=4, weekday=MO(-1), weeks=+14)
    149     datetime.datetime(1997, 4, 7, 0, 0)
    150 
    151 How long ago has the millennium changed?
    152 
    153 .. doctest:: relativedelta
    154     :options: +NORMALIZE_WHITESPACE
    155 
    156     >>> relativedelta(NOW, date(2001,1,1))
    157     relativedelta(years=+2, months=+8, days=+16,
    158                   hours=+20, minutes=+54, seconds=+47, microseconds=+282310)
    159 
    160 How old is John?
    161 
    162 .. doctest:: relativedelta
    163     :options: +NORMALIZE_WHITESPACE
    164 
    165     >>> johnbirthday = datetime(1978, 4, 5, 12, 0)
    166     >>> relativedelta(NOW, johnbirthday)
    167     relativedelta(years=+25, months=+5, days=+12,
    168               hours=+8, minutes=+54, seconds=+47, microseconds=+282310)
    169 
    170 It works with dates too.
    171 
    172 .. doctest:: relativedelta
    173 
    174     >>> relativedelta(TODAY, johnbirthday)
    175     relativedelta(years=+25, months=+5, days=+11, hours=+12)
    176 
    177 Obtain today's date using the yearday:
    178 
    179 .. doctest:: relativedelta
    180 
    181     >>> date(2003, 1, 1)+relativedelta(yearday=260)
    182     datetime.date(2003, 9, 17)
    183 
    184 We can use today's date, since yearday should be absolute
    185 in the given year:
    186 
    187 .. doctest:: relativedelta
    188 
    189     >>> TODAY+relativedelta(yearday=260)
    190     datetime.date(2003, 9, 17)
    191 
    192 Last year it should be in the same day:
    193 
    194 .. doctest:: relativedelta
    195 
    196     >>> date(2002, 1, 1)+relativedelta(yearday=260)
    197     datetime.date(2002, 9, 17)
    198 
    199 But not in a leap year:
    200 
    201 .. doctest:: relativedelta
    202 
    203     >>> date(2000, 1, 1)+relativedelta(yearday=260)
    204     datetime.date(2000, 9, 16)
    205 
    206 We can use the non-leap year day to ignore this:
    207 
    208 .. doctest:: relativedelta
    209 
    210     >>> date(2000, 1, 1)+relativedelta(nlyearday=260)
    211     datetime.date(2000, 9, 17)
    212