Module:Date: Difference between revisions
when parse a date, replace nbsp with space and record input format (dmy/mdy/ymd) in date.format
(use error(...) to report caller's errors) |
(when parse a date, replace nbsp with space and record input format (dmy/mdy/ymd) in date.format) |
||
Line 187: | Line 187: | ||
date.second = S -- 0 to 59 | date.second = S -- 0 to 59 | ||
if type(options) == 'table' then | if type(options) == 'table' then | ||
for _, k in ipairs({ 'am', 'era' }) do | for _, k in ipairs({ 'am', 'era', 'format' }) do | ||
if options[k] then | if options[k] then | ||
date.options[k] = options[k] | date.options[k] = options[k] | ||
Line 380: | Line 380: | ||
error('date:text: need a date (use "date:text()" with a colon)', 2) | error('date:text: need a date (use "date:text()" with a colon)', 2) | ||
end | end | ||
if type(fmt) | if type(fmt) == 'string' and fmt:match('%S') then | ||
if fmt:find('%', 1, true) then | |||
return strftime(date, fmt, options) | |||
end | |||
else | |||
fmt = 'dmy' | fmt = 'dmy' | ||
if date.hastime then | if date.hastime then | ||
fmt = (date.second > 0 and 'hms ' or 'hm ') .. fmt | fmt = (date.second > 0 and 'hms ' or 'hm ') .. fmt | ||
end | end | ||
end | end | ||
local function hm_fmt() | local function hm_fmt() | ||
Line 608: | Line 610: | ||
-- Parse the date/time in text and return n, o where | -- Parse the date/time in text and return n, o where | ||
-- n = table of numbers with date/time fields | -- n = table of numbers with date/time fields | ||
-- o = table of options for AM/PM or AD/BC, if any | -- o = table of options for AM/PM or AD/BC or format, if any | ||
-- or return nothing if date is known to be invalid. | -- or return nothing if date is known to be invalid. | ||
-- Caller determines if the values in n are valid. | -- Caller determines if the values in n are valid. | ||
Line 615: | Line 617: | ||
-- ('0001' to '9999'). The only way to enter year <= 0 is by specifying | -- ('0001' to '9999'). The only way to enter year <= 0 is by specifying | ||
-- the date as three numeric parameters like ymd Date(-1, 1, 1). | -- the date as three numeric parameters like ymd Date(-1, 1, 1). | ||
-- Dates of form d/m/y, m/d/y, y/m/d are rejected as ambiguous. | -- Dates of form d/m/y, m/d/y, y/m/d are rejected as potentially ambiguous. | ||
local date, options = {}, {} | local date, options = {}, {} | ||
local function extract_ymd(item) | local function extract_ymd(item) | ||
Line 627: | Line 629: | ||
end | end | ||
if m then | if m then | ||
options.format = 'ymd' | |||
date.year = tonumber(ystr) | date.year = tonumber(ystr) | ||
date.month = m | date.month = m | ||
Line 635: | Line 638: | ||
end | end | ||
local function extract_month(item) | local function extract_month(item) | ||
-- A month must be given as a name or abbreviation; a number | -- A month must be given as a name or abbreviation; a number could be ambiguous. | ||
local m = month_number(item) | local m = month_number(item) | ||
if m then | if m then | ||
Line 682: | Line 685: | ||
end | end | ||
end | end | ||
for item in text:gsub(',', ' '):gmatch('%S+') do | for item in text:gsub(',', ' '):gsub(' ', ' '):gmatch('%S+') do | ||
item_count = item_count + 1 | item_count = item_count + 1 | ||
if era_text[item] then | if era_text[item] then | ||
Line 719: | Line 722: | ||
if item:match('^(%d%d?)$') then | if item:match('^(%d%d?)$') then | ||
date.day = tonumber(item) | date.day = tonumber(item) | ||
elseif | options.format = 'dmy' | ||
elseif extract_month(item) then | |||
options.format = 'mdy' | |||
else | |||
return | return | ||
end | end | ||
Line 839: | Line 845: | ||
-- Era text (never a negative sign) from year and options. | -- Era text (never a negative sign) from year and options. | ||
value = get_era_for_year(self.options.era, self.year) | value = get_era_for_year(self.options.era, self.year) | ||
elseif key == 'format' then | |||
value = self.options.format or 'dmy' | |||
elseif key == 'gsd' then | elseif key == 'gsd' then | ||
-- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar, | -- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar, |