author | Kim Alvefur <zash@zash.se> |
Wed, 19 Oct 2022 14:21:13 +0200 | |
changeset 12781 | 4d5549de27e6 |
parent 12637 | 5d8b0e0b9d48 |
permissions | -rw-r--r-- |
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 | 5 |
-- This project is MIT/X11 licensed. Please see the |
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; |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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 |
|
6780
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; |
8558
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7262
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 |
|
6780
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) |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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 |
|
6780
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) |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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:
9702
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:
9702
diff
changeset
|
28 |
end |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
diff
changeset
|
29 |
local m = t % 1; |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
diff
changeset
|
30 |
local s = floor(t); |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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 |
|
6780
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) |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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:
9702
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:
9702
diff
changeset
|
37 |
end |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
diff
changeset
|
38 |
local m = t % 1; |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
diff
changeset
|
39 |
local s = floor(t); |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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 |
|
6780
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) |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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 |
|
6780
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 |
12637 | 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 |
9702
e616c37756b3
util.datetime: Make sure timezone difference is calculated correctly (fixes #1262)
Kim Alvefur <zash@zash.se>
parents:
8558
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:
8558
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 |
12633
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
diff
changeset
|
62 |
local prec = sec%1; |
4c1d3f817063
util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents:
9702
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:
9702
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 |
|
6780
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 |
}; |