2016-04-12 19:42:35 +02:00
|
|
|
--Summer winter time convertion
|
|
|
|
--See: https://arduinodiy.wordpress.com/2015/10/13/the-arduino-and-daylight-saving-time/
|
|
|
|
--
|
|
|
|
--As October has 31 days, we know that the last Sunday will always fall from the 25th to the 31st
|
|
|
|
--So our check at the end of daylight saving will be as follows:
|
|
|
|
--if (dow == 7 && mo == 10 && d >= 25 && d <=31 && h == 3 && DST==1)
|
|
|
|
--{
|
|
|
|
--setclockto 2 am;
|
|
|
|
--DST=0;
|
|
|
|
--}
|
|
|
|
--
|
|
|
|
--To start summertime/daylightsaving time on the last Sunday in March is mutatis mutandis the same:
|
|
|
|
--if (dow == 7 && mo == 3 && d >= 25 && d <=31 && h ==2 && DST==0)
|
|
|
|
--{
|
|
|
|
--setclockto 3 am;
|
|
|
|
--DST=1;
|
|
|
|
--}
|
|
|
|
|
2016-05-15 15:44:19 +02:00
|
|
|
-- @fn isSummerTime(year, month, day, hour, minute, second,dow)
|
|
|
|
-- @param year Current year of day range (2016 - ...)
|
|
|
|
-- @param month Current month of year range (1 - 12) e.g. 2 is Februrary
|
|
|
|
-- @param day Current day in month range (1 - 31)
|
|
|
|
-- @param hour Current hour of day range (0 - 23)
|
|
|
|
-- @param minute Current minute in hour range (0 - 59)
|
|
|
|
-- @param second Current second of minute range (0 - 59)
|
|
|
|
-- @param dow Current day of week range (1 - 7) (1 is Monday, 7 is Sunday)
|
2016-05-15 15:46:00 +02:00
|
|
|
-- @return <code>true</code> if we have currently summer time
|
|
|
|
-- @return <code>false</code> if we have winter time
|
2016-05-15 15:44:19 +02:00
|
|
|
function isSummerTime(year, month, day, hour, minute, second,dow)
|
2016-04-12 19:42:35 +02:00
|
|
|
-- we are in 100% in the summer time
|
|
|
|
if (month > 3 and month < 10) then
|
2016-05-15 15:44:19 +02:00
|
|
|
return true
|
2016-04-12 21:02:56 +02:00
|
|
|
-- March is not 100% Summer time, only starting at the last sunday
|
|
|
|
elseif ((month == 3 and day >= 25 and day <= 31 and hour > 2 and dow == 7) or
|
|
|
|
-- Only handle days after the last sunday in this month
|
|
|
|
((month == 3 and day >= 25 and day <= 31 and dow < 7 and ((7-dow + day) > 31))) ) then
|
2016-05-15 15:44:19 +02:00
|
|
|
-- summer time
|
|
|
|
return true
|
2016-04-12 21:02:56 +02:00
|
|
|
-- October is not 100% Summer time, ending with the last sunday
|
2016-05-15 15:44:19 +02:00
|
|
|
elseif ((month == 10 and day >= 25 and day <= 31 and (hour < 2 or (hour == 2 and minute== 0 and second == 0)) and dow == 7) or
|
2016-04-12 21:02:56 +02:00
|
|
|
(month == 10 and day >= 25 and day <= 31 and dow < 7 and ((7-dow + day) <= 31)) or
|
|
|
|
-- Handle all days up to the 25. of october
|
|
|
|
(month == 10 and day < 25 )
|
|
|
|
)then
|
2016-05-15 15:44:19 +02:00
|
|
|
-- summer time
|
|
|
|
return true
|
2016-04-12 19:42:35 +02:00
|
|
|
end
|
2016-05-15 15:44:19 +02:00
|
|
|
-- otherwise it must be winter time
|
|
|
|
return false
|
2016-04-12 19:42:35 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
-- Convert a given month in english abr. to number from 1 to 12.
|
|
|
|
-- On unknown arguments, zero is returned.
|
|
|
|
function convertMonth(str)
|
|
|
|
if (str=="Jan") then
|
|
|
|
return 1
|
|
|
|
elseif (str == "Feb") then
|
|
|
|
return 2
|
|
|
|
elseif (str == "Mar") then
|
|
|
|
return 3
|
|
|
|
elseif (str == "Apr") then
|
|
|
|
return 4
|
|
|
|
elseif (str == "May") then
|
|
|
|
return 5
|
|
|
|
elseif (str == "Jun") then
|
|
|
|
return 6
|
|
|
|
elseif (str == "Jul") then
|
|
|
|
return 7
|
|
|
|
elseif (str == "Aug") then
|
|
|
|
return 8
|
|
|
|
elseif (str == "Sep") then
|
|
|
|
return 9
|
|
|
|
elseif (str == "Oct") then
|
|
|
|
return 10
|
|
|
|
elseif (str == "Nov") then
|
|
|
|
return 11
|
|
|
|
elseif (str == "Dec") then
|
|
|
|
return 12
|
|
|
|
else
|
|
|
|
return 0
|
|
|
|
end
|
2016-04-17 16:16:17 +02:00
|
|
|
end
|
2016-05-14 12:25:55 +02:00
|
|
|
|
|
|
|
----------------------------------------------------------
|
|
|
|
-- Here comes some code to extract the year, month, day, hour, minute, second and day of week of a unix timestamp
|
|
|
|
|
|
|
|
-- Source:
|
|
|
|
-- http://www.jbox.dk/sanos/source/lib/time.c.html
|
|
|
|
|
|
|
|
YEAR0=1900
|
|
|
|
|
|
|
|
EPOCH_YR=1970
|
|
|
|
--SECS_DAY=(24L * 60L * 60L)
|
|
|
|
SECS_DAY=86400
|
|
|
|
|
|
|
|
ytab = {}
|
|
|
|
ytab[0] = {}
|
|
|
|
ytab[1] = {}
|
|
|
|
ytab[0][0] = 31
|
|
|
|
ytab[0][1] = 28
|
|
|
|
ytab[0][2] = 31
|
|
|
|
ytab[0][3] = 30
|
|
|
|
ytab[0][4] = 31
|
|
|
|
ytab[0][5] = 30
|
|
|
|
ytab[0][6] = 31
|
|
|
|
ytab[0][7] = 31
|
|
|
|
ytab[0][8] = 30
|
|
|
|
ytab[0][9] = 31
|
|
|
|
ytab[0][10] = 30
|
|
|
|
ytab[0][11] = 31
|
|
|
|
ytab[1][0] = 31
|
|
|
|
ytab[1][1] = 29
|
|
|
|
ytab[1][2] = 31
|
|
|
|
ytab[1][3] = 30
|
|
|
|
ytab[1][4] = 31
|
|
|
|
ytab[1][5] = 30
|
|
|
|
ytab[1][6] = 31
|
|
|
|
ytab[1][7] = 31
|
|
|
|
ytab[1][8] = 30
|
|
|
|
ytab[1][9] = 31
|
|
|
|
ytab[1][10] = 30
|
|
|
|
ytab[1][11] = 31
|
|
|
|
|
|
|
|
|
2016-05-14 23:28:20 +02:00
|
|
|
local leapyear = function(year)
|
|
|
|
return ( not ((year) % 4 ~= 0) and (((year) % 100 ~= 0) or not ((year) % 400 ~= 0)))
|
2016-05-14 12:25:55 +02:00
|
|
|
end
|
|
|
|
|
2016-05-14 23:28:20 +02:00
|
|
|
local yearsize = function(year)
|
2016-05-14 12:25:55 +02:00
|
|
|
if leapyear(year) then
|
|
|
|
return 366
|
|
|
|
else
|
|
|
|
return 365
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-05-15 15:44:19 +02:00
|
|
|
function getUTCtime(unixtimestmp)
|
2016-05-14 12:25:55 +02:00
|
|
|
local year = EPOCH_YR
|
|
|
|
local dayclock = math.floor(unixtimestmp % SECS_DAY)
|
2016-05-14 23:28:20 +02:00
|
|
|
dayno = math.floor(unixtimestmp / SECS_DAY)
|
2016-05-14 12:25:55 +02:00
|
|
|
|
2016-05-14 23:28:20 +02:00
|
|
|
local sec = math.floor(dayclock % 60)
|
2016-05-14 12:25:55 +02:00
|
|
|
local min = math.floor( (dayclock % 3600) / 60)
|
|
|
|
local hour = math.floor(dayclock / 3600)
|
|
|
|
local wday = math.floor( (dayno + 4) % 7) -- Day 0 was a thursday
|
|
|
|
|
|
|
|
while (dayno >= yearsize(year))
|
|
|
|
do
|
|
|
|
dayno = dayno - yearsize(year);
|
|
|
|
year=year + 1
|
|
|
|
end
|
2016-05-14 23:28:20 +02:00
|
|
|
--Day in whole year: local yday = dayno (Not needed)
|
|
|
|
mon = 0
|
|
|
|
while (dayno >= ytab[leapyear(year) and 1 or 0][mon])
|
2016-05-14 12:25:55 +02:00
|
|
|
do
|
2016-05-14 23:28:20 +02:00
|
|
|
dayno = dayno - ytab[leapyear(year) and 1 or 0][mon];
|
2016-05-14 12:25:55 +02:00
|
|
|
mon = mon + 1
|
|
|
|
end
|
|
|
|
mday = dayno + 1
|
|
|
|
|
2016-05-14 23:28:20 +02:00
|
|
|
return year, (mon+1), mday, hour, min, sec, wday
|
2016-05-14 12:25:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
|