Skip to content

Date

Source: shiva-fw/libs/date/init.lua

Immutable date/time objects with arithmetic, comparison, and formatting. All arithmetic methods return new DateObject instances — the original is never mutated.

Availability

Date is a global in every shiva module (loaded by sh_init.lua). No import required.

Static Constructors

Date.now()

Current date and time.

lua
local now = Date.now()

Date.today()

Today at midnight (00:00:00).

lua
local today = Date.today()

Date.create(year, month, day, hour?, minute?, second?)

Build a date from components. Time components default to 0.

lua
local d = Date.create(2024, 6, 15)
local d = Date.create(2024, 6, 15, 14, 30, 0)

Date.parse(str)

Parse a date string. Supported formats: 'YYYY-MM-DD' and 'YYYY-MM-DD HH:MM:SS' / 'YYYY-MM-DDTHH:MM:SS'.

lua
local d = Date.parse('2024-06-15')
local d = Date.parse('2024-06-15T14:30:00')

Date.fromTimestamp(ts)

Create from a Unix timestamp.

lua
local d = Date.fromTimestamp(os.time())

Date.isLeapYear(year)

lua
Date.isLeapYear(2024)  -- true

Date.daysInMonth(year, month)

lua
Date.daysInMonth(2024, 2)  -- 29

Date.diff(a, b, unit)

Difference between two DateObjects (a − b) in 'seconds', 'minutes', 'hours', or 'days'.

lua
local days = Date.diff(Date.now(), pastDate, 'days')

Instance Getters

lua
local d = Date.now()
d:timestamp()   -- Unix timestamp (integer)
d:year()        -- e.g. 2024
d:month()       -- 1–12
d:day()         -- 1–31
d:hour()        -- 0–23
d:minute()      -- 0–59
d:second()      -- 0–59
d:dayOfWeek()   -- 1 (Sunday) – 7 (Saturday)
d:dayOfYear()   -- 1–366
d:isLeapYear()  -- boolean
d:daysInMonth() -- integer

Formatting

:format(pattern)

Format using an os.date pattern string.

lua
d:format('%Y-%m-%d')   -- '2024-06-15'
d:format('%H:%M:%S')   -- '14:30:00'

:toISO()

ISO 8601: 'YYYY-MM-DDTHH:MM:SS'

:toDateString()

Date only: 'YYYY-MM-DD'

:toTimeString()

Time only: 'HH:MM:SS'

Arithmetic

All methods return a new DateObject.

lua
d:addSeconds(n)    d:subSeconds(n)
d:addMinutes(n)    d:subMinutes(n)
d:addHours(n)      d:subHours(n)
d:addDays(n)       d:subDays(n)
d:addMonths(n)     d:subMonths(n)   -- clamps to last valid day
d:addYears(n)      d:subYears(n)    -- clamps Feb 29 on non-leap years

Comparison

lua
d:isBefore(other)    -- boolean
d:isAfter(other)     -- boolean
d:isSame(other)      -- exact timestamp equality
d:isSameDay(other)   -- same calendar day

Difference (instance methods)

lua
d:diffInSeconds(other)
d:diffInMinutes(other)
d:diffInHours(other)
d:diffInDays(other)

Period Boundaries

lua
d:startOfDay()     -- 00:00:00
d:endOfDay()       -- 23:59:59
d:startOfMonth()   -- 1st at 00:00:00
d:endOfMonth()     -- last day at 23:59:59
d:startOfYear()    -- Jan 1 at 00:00:00
d:endOfYear()      -- Dec 31 at 23:59:59

Released under the MIT License.