===DateAdd() Function (VB work-a-like)=== The following is a DateAdd function for calculating dates with intervals added (or subtracted). It is inspired by the [[https://www.w3schools.com/asp/func_dateadd.asp|VB function of the same name]] but is tweaked slightly from the original and returns a datetime string (DD-MM-YYYY HH:MM:SS) with x intervals added. Intervals are specified with a string and are: yyyy - Year mm - Calendar Month w - Calendar week (7 days) dd - Day h - Hour m - Minute s - Second By default the interval is added to the supplied date, to subtract it, make the numberof value negative e.g. x=-x or x=x-2*x There is little to no error checking so if you supply nonsense you will probably crash it or get rubbish back. Dates are intrinsically tied with UnixTime constraints and attempts to work with dates before 01-01-1970 will likely return junk. Notes: Dates will default to 1st March if it would have resulted in a nonsense leap day. i.e. 29-02-2016 + 1 year is 01-03 (and not 29-02-2017). ISO8601 format (yyyy-mm-dd) is not yet supported. Passing a non-recognized interval will return the empty string "". **Syntax**: =DateAdd(numberof,interval,datestr) **Examples**: Print DateAdd(7,"mm","01-01-1970 00:00:00") ' show the date seven months from 1st january 1970 InvoiceDue$=DateAdd(30,"d",Now()) ' set the due date 30 days from now Print DateAdd(-85000,"m","28-02-2010 17:00:00")' show the date 85000 minutes before 28th Feb 2010 DSTTime$=DateAdd(60,"m",Now()) ' Calculate +1 daylight saving time **Dependencies**: * [[UnixTime_or_Epoch_Time|UnixTime]]\\ * [[IsLeapYear_Function_to_determine_if_the_given_year_is_a_Leap_Year_on_the_Gregorian_western_calendar|IsLeapYear]]\\ * [[ZPad_pad_a_number_with_leading_zeroes|ZPad$]]\\ * [[HumanTime_Function_to_return_a_human_readable_date_and_time_from_a_unixtime_number|HumanTime]]\\ **Code**: Function DateAdd(Num As Integer,Interval As String,dt As String) As String 'return a string of the datetime with the relevant period added 'add -ve to subtract e.g. 'DateAdd (2,"mm",Now()) returns the datetime time two months from now. 'DateAdd(-1000,"dd",Now()) returns the datetime a thousand days ago Local Integer x,y,z Select Case LCase$(Interval) Case "s"' Seconds DateAdd=HumanTime(UnixTime(dt)+Num) Case "m"' Minutes DateAdd=HumanTime(UnixTime(dt)+(Num*60)) Case "h"' Hours DateAdd=HumanTime(UnixTime(dt)+(Num*3600)) Case "dd" 'Days DateAdd=HumanTime(UnixTime(dt+(Num*86400)) Case "w" 'Weeks DateAdd=HumanTime(UnixTime(dt)+(Num*604800)) Case "mm"' calendar Months x=Val(Mid$(dt,4,2))-1: y=Val(Mid$(dt,7,4)): z=Val(Left$(dt,2)) x=((x+Num) Mod 12)+1: y=y+Num\12 If (x=2 And z=29) And (Not IsLeapYear(y)) Then ' bludgeon for 29/02 in non-leap year x=3:z=1 EndIf DateAdd=ZPad$(z,2)+"-"+ZPad$(Abs(x),2)+"-"+Zpad$(y,4)+ Right$(dt$,9) Case "yyyy"' Years x=Val(Left$(dt,2)): y=Val(Mid$(dt,4,2)): z=Val(Mid$(dt,7,4)): z=z+num If (y=2 And x=29) And (Not IsLeapYear(z)) Then ' bludgeon for 29/02 in non-leap year y=3:x=1 EndIf DateAdd=ZPad$(x,2)+"-"+ZPad$(Abs(y),2)+"-"+Zpad$(z,4)+ Right$(dt$,9) Case Else DateAdd="" End Select End Function **See Also**: [[DateDiff_Function_VB_work_a_like|DateDiff()]]\\ [[Now_Function_VB_work_a_like|Now()]]\\ [[DatePart_Function_VB_work_a_like|DatePart()]]\\