The easiest way I found to do this is setup up a gateway timer script. Below is one I have been using for awhile.
#get current date and time
now = system.date.now()
dayOfMonth = system.date.getDayOfMonth(now)
hour = system.date.getHour24(now)
minute = system.date.getMinute(now)
second = system.date.getSecond(now)
#equipment list
equipment = [1734,1747,1752,1756,1770,1786,1787,1795,1799,
1803,1806,1809,1813,1814,1815,1816,1818,1821,1822,1823,1824,1825,1826,1827,1828,1829,
1830,1831,1832,1833,1834,1845,1852,1854,1856,1857,1861,1862,1863,1867,1873,
1875,1877,1878,1879,1881,1883,1884,1885,1887,1888,1891,1892,1893,1894,1895,1896,
10838,10851,10852,10859,10861,10894,10899,10900,10901]
#moves downtime hours, downtime timer, and state(if state is 1 then it moves it to 0 and the writes a 1 back at the start of the new month)
if dayOfMonth == 1 and hour == 0 and minute == 0 and second == 0:
for x in equipment:
if system.tag.read("[default]Moblie/Downtime" + str(x) + "State").value == 1:
system.tag.write("[default]Moblie/Downtime" + str(x) + "State", 0)
system.tag.write("[default]Moblie/Downtime" + str(x), 0)
system.tag.write("[default]Moblie/Downtime" + str(x) + "Timer", 0)
system.tag.write("[default]Moblie/Downtime" + str(x) + "State", 1)
else:
system.tag.write("[default]Moblie/Downtime" + str(x), 0)
system.tag.write("[default]Moblie/Downtime" + str(x) + "Timer", 0)