util/datetime.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 12637 5d8b0e0b9d48
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
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
5d8b0e0b9d48 util.datetime: Remove a line
Kim Alvefur <zash@zash.se>
parents: 12633
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
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
};