util/datetime.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 9702 e616c37756b3
child 12633 4c1d3f817063
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
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;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    15
local tonumber = tonumber;
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    16
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
    17
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7262
diff changeset
    18
-- luacheck: std none
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    19
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
    20
local function date(t)
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    21
	return os_date("!%Y-%m-%d", t);
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    22
end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    23
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
    24
local function datetime(t)
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    25
	return os_date("!%Y-%m-%dT%H:%M:%SZ", t);
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    26
end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    27
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
    28
local function time(t)
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    29
	return os_date("!%H:%M:%S", t);
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    30
end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    31
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
    32
local function legacy(t)
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    33
	return os_date("!%Y%m%dT%H:%M:%S", t);
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    34
end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    35
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
    36
local function parse(s)
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    37
	if s then
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    38
		local year, month, day, hour, min, sec, tzd;
5107
6ac790efecd3 util.datetime: Fix timestamp parsing pattern.
Waqas Hussain <waqas20@gmail.com>
parents: 4250
diff changeset
    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+%-]?.*)$");
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    40
		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
    41
			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
    42
			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
    43
			local tzd_offset = 0;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    44
			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
    45
				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
    46
				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
    47
				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
    48
				h, m = tonumber(h), tonumber(m);
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    49
				tzd_offset = h * 60 * 60 + m * 60;
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    50
				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
    51
			end
3643
2dc342a13f35 util.datetime: Fix so that the timestamp returned is always in UTC, timezone offsets were going in the wrong direction
Matthew Wild <mwild1@gmail.com>
parents: 3642
diff changeset
    52
			sec = (sec + time_offset) - tzd_offset;
4250
7b456af75c77 util.datetime: Fix timestamp parsing when in DST (thanks xnyhps)
Matthew Wild <mwild1@gmail.com>
parents: 3643
diff changeset
    53
			return os_time({year=year, month=month, day=day, hour=hour, min=min, sec=sec, isdst=false});
3430
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    54
		end
970690b3cb28 util.datetime: Added implementation for function parse().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    55
	end
921
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    56
end
f97d37a7d8a6 util.datetime: Allow specifying a time to format
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    57
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
    58
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
    59
	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
    60
	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
    61
	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
    62
	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
    63
	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
    64
};