util/datetime.lua
author Kim Alvefur <zash@zash.se>
Fri, 27 May 2022 14:45:35 +0200
branch0.12
changeset 12530 252ed01896dd
parent 9702 e616c37756b3
child 12633 4c1d3f817063
permissions -rw-r--r--
mod_smacks: Bounce unhandled stanzas from local origin (fix #1759) Sending stanzas with a remote session as origin when the stanzas have a local JID in the from attribute trips validation in core.stanza_router, leading to warnings: > Received a stanza claiming to be from remote.example, over a stream authed for localhost.example Using module:send() uses the local host as origin, which is fine here.
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
};