2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
10 -- XEP-0082: XMPP Date and Time Profiles
12 local os_date
= os
.date;
13 local os_time
= os
.time
;
14 local os_difftime
= os
.difftime
;
15 local tonumber = tonumber;
20 local function date(t
)
21 return os_date("!%Y-%m-%d", t
);
24 local function datetime(t
)
25 return os_date("!%Y-%m-%dT%H:%M:%SZ", t
);
28 local function time(t
)
29 return os_date("!%H:%M:%S", t
);
32 local function legacy(t
)
33 return os_date("!%Y%m%dT%H:%M:%S", t
);
36 local function parse(s
)
38 local year
, month
, day
, hour
, min, sec
, tzd
;
39 year
, month
, day
, hour
, min, sec
, tzd
= s
:match("^(%d%d%d%d)%-?(%d%d)%-?(%d%d)T(%d%d):(%d%d):(%d%d)%.?%d*([Z+%-]?.*)$");
41 local now
= os_time();
42 local time_offset
= os_difftime(os_time(os_date("*t", now
)), os_time(os_date("!*t", now
))); -- to deal with local timezone
44 if tzd
~= "" and tzd
~= "Z" then
45 local sign
, h
, m
= tzd
:match("([+%-])(%d%d):?(%d*)");
46 if not sign
then return; end
47 if #m
~= 2 then m
= "0"; end
48 h
, m
= tonumber(h
), tonumber(m
);
49 tzd_offset
= h
* 60 * 60 + m
* 60;
50 if sign
== "-" then tzd_offset
= -tzd_offset
; end
52 sec
= (sec
+ time_offset
) - tzd_offset
;
53 return os_time({year
=year
, month
=month
, day
=day
, hour
=hour
, min=min, sec
=sec
, isdst
=false});