Annotate

util/datetime.lua @ 12958:640476114eb6

CHANGES: Add keyval+
author Matthew Wild <mwild1@gmail.com>
date Tue, 21 Mar 2023 18:59:19 +0000
parent 12633:5d8b0e0b9d48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 921
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5107
diff changeset
4 --
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
6 -- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 248
diff changeset
7 --
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 248
diff changeset
8
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 248
diff changeset
9
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
10 -- XEP-0082: XMPP Date and Time Profiles
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
11
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
12 local os_date = os.date;
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
13 local os_time = os.time;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
14 local os_difftime = os.difftime;
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
15 local floor = math.floor;
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
16 local tonumber = tonumber;
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
17
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
18 local _ENV = nil;
8555
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7259
diff changeset
19 -- luacheck: std none
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
20
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
21 local function date(t)
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
22 return os_date("!%Y-%m-%d", t and floor(t) or nil);
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
23 end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
24
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
25 local function datetime(t)
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
26 if t == nil or t % 1 == 0 then
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
27 return os_date("!%Y-%m-%dT%H:%M:%SZ", t);
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
28 end
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
29 local m = t % 1;
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
30 local s = floor(t);
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
31 return os_date("!%Y-%m-%dT%H:%M:%S.%%06dZ", s):format(floor(m * 1000000));
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
32 end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
33
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
34 local function time(t)
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
35 if t == nil or t % 1 == 0 then
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
36 return os_date("!%H:%M:%S", t);
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
37 end
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
38 local m = t % 1;
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
39 local s = floor(t);
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
40 return os_date("!%H:%M:%S.%%06d", s):format(floor(m * 1000000));
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
41 end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
42
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
43 local function legacy(t)
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
44 return os_date("!%Y%m%dT%H:%M:%S", t and floor(t) or nil);
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
45 end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
46
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
47 local function parse(s)
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
48 if s then
12633
5d8b0e0b9d48 util.datetime: Remove a line
Kim Alvefur <zash@zash.se>
parents: 12629
diff changeset
49 local 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+%-]?.*)$");
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
50 if year then
9698
e616c37756b3 util.datetime: Make sure timezone difference is calculated correctly (fixes #1262)
Kim Alvefur <zash@zash.se>
parents: 8555
diff changeset
51 local now = os_time();
e616c37756b3 util.datetime: Make sure timezone difference is calculated correctly (fixes #1262)
Kim Alvefur <zash@zash.se>
parents: 8555
diff changeset
52 local time_offset = os_difftime(os_time(os_date("*t", now)), os_time(os_date("!*t", now))); -- to deal with local timezone
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
53 local tzd_offset = 0;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
54 if tzd ~= "" and tzd ~= "Z" then
3642
ed80c4c56b9c util.datetime: Fixes for more liberal timezone parsing - colon and minutes are both (independantly) optional (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 3430
diff changeset
55 local sign, h, m = tzd:match("([+%-])(%d%d):?(%d*)");
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
56 if not sign then return; end
3642
ed80c4c56b9c util.datetime: Fixes for more liberal timezone parsing - colon and minutes are both (independantly) optional (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 3430
diff changeset
57 if #m ~= 2 then m = "0"; end
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
58 h, m = tonumber(h), tonumber(m);
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
59 tzd_offset = h * 60 * 60 + m * 60;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
60 if sign == "-" then tzd_offset = -tzd_offset; end
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
61 end
12629
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
62 local prec = sec%1;
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
63 sec = floor(sec + time_offset) - tzd_offset;
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 9698
diff changeset
64 return os_time({year=year, month=month, day=day, hour=hour, min=min, sec=sec, isdst=false})+prec;
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
65 end
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
66 end
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
67 end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
68
6777
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
69 return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
70 date = date;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
71 datetime = datetime;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
72 time = time;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
73 legacy = legacy;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
74 parse = parse;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
75 };