DateTime Module
Date and time operations with UTC timezone support.
The DateTime module provides functions for creating, parsing, formatting, and manipulating date and time values. All operations use UTC timezone. DateTimes are opaque native objects backed by the chrono crate.
Common patterns
import DateTime
-- Get current time
DateTime.now () |> DateTime.format |> IO.println
-- "2024-02-20T14:30:45Z"
-- Parse and manipulate
"2024-01-15T10:00:00Z"
|> DateTime.parse
|> Maybe.map (DateTime.addDays 7)
|> Maybe.map (DateTime.addHours 2)
|> Maybe.map DateTime.format
-- Just "2024-01-22T12:00:00Z"
-- Create from components
DateTime.fromDate 2024 6 15
|> Maybe.map DateTime.format
-- Just "2024-06-15T00:00:00Z"
-- Custom formatting
DateTime.now ()
|> DateTime.formatCustom "%Y-%m-%d %H:%M"
-- "2024-02-20 14:30"
-- Calendar operations
DateTime.now ()
|> DateTime.startOfMonth
|> DateTime.addMonths 1
|> DateTime.format
-- "2024-03-01T00:00:00Z"
-- Time differences
let dt1 = DateTime.fromDate 2024 1 1
let dt2 = DateTime.fromDate 2024 12 31
DateTime.diffDays dt1 dt2 -- 365
Return types
Functions that can fail return Maybe DateTime:
parse : String -> Maybe DateTimefromParts : Int -> Int -> Int -> Int -> Int -> Int -> Maybe DateTimefromDate : Int -> Int -> Int -> Maybe DateTime
Security
| Variable | Effect |
|---|---|
KEEL_DATETIME_DISABLED=1 | Disable all DateTime operations |
Functions
Creation
DateTime.now
() -> DateTime
Get the current UTC time.
import DateTime
DateTime.now ()Try itNotes: Takes Unit argument to trigger execution.
See also: DateTime.fromTimestamp, DateTime.format
DateTime.fromParts
Int -> Int -> Int -> Int -> Int -> Int -> Maybe DateTime
Create a DateTime from year, month, day, hour, minute, second (returns Maybe DateTime).
import DateTime
DateTime.fromParts 2024 1 15 10 30 0Try itNotes: Returns Nothing for invalid dates (e.g., month 13, day 32).
See also: DateTime.fromDate, DateTime.fromTimestamp
DateTime.fromDate
Int -> Int -> Int -> Maybe DateTime
Create a DateTime from year, month, day at 00:00:00 (returns Maybe DateTime).
import DateTime
DateTime.fromDate 2024 1 15Try itNotes: Returns Nothing for invalid dates.
See also: DateTime.fromParts, DateTime.fromTimestamp
DateTime.fromTimestamp
Int -> DateTime
Create a DateTime from a Unix timestamp in seconds.
import DateTime
DateTime.fromTimestamp 1700000000Try itSee also: DateTime.fromTimestampMillis, DateTime.toTimestamp
DateTime.fromTimestampMillis
Int -> DateTime
Create a DateTime from a Unix timestamp in milliseconds.
import DateTime
DateTime.fromTimestampMillis 1700000000000Try itSee also: DateTime.fromTimestamp, DateTime.toTimestampMillis
DateTime.toTimestamp
DateTime -> Int
Convert a DateTime to a Unix timestamp in seconds.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.toTimestampTry itSee also: DateTime.toTimestampMillis, DateTime.fromTimestamp
DateTime.toTimestampMillis
DateTime -> Int
Convert a DateTime to a Unix timestamp in milliseconds.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.toTimestampMillisTry itSee also: DateTime.toTimestamp, DateTime.fromTimestampMillis
Parsing
DateTime.parse
String -> Maybe DateTime
Parse an ISO8601 or RFC3339 datetime string (returns Maybe DateTime).
import DateTime
DateTime.parse "2024-01-15T10:30:00Z"Try itNotes: Accepts both ISO8601 and RFC3339 formats.
See also: DateTime.parseIso8601, DateTime.parseRfc3339, DateTime.parseFormat
DateTime.parseIso8601
String -> Maybe DateTime
Parse a strict ISO8601 datetime string (returns Maybe DateTime).
import DateTime
DateTime.parseIso8601 "2024-01-15T10:30:00Z"Try itSee also: DateTime.parse, DateTime.parseRfc3339
DateTime.parseRfc3339
String -> Maybe DateTime
Parse a strict RFC3339 datetime string (returns Maybe DateTime).
import DateTime
DateTime.parseRfc3339 "2024-01-15T10:30:00+00:00"Try itSee also: DateTime.parse, DateTime.parseIso8601
DateTime.parseFormat
String -> String -> Maybe DateTime
Parse a datetime string using a custom strftime format (returns Maybe DateTime).
import DateTime
DateTime.parseFormat "%Y-%m-%d" "2024-01-15"Try itNotes: First argument is the format string, second is the datetime string.
See also: DateTime.parse, DateTime.formatCustom
Formatting
DateTime.format
DateTime -> String
Format a DateTime as an ISO8601 string.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.formatTry itSee also: DateTime.formatRfc3339, DateTime.formatCustom
DateTime.formatRfc3339
DateTime -> String
Format a DateTime as an RFC3339 string.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.formatRfc3339Try itSee also: DateTime.format, DateTime.formatCustom
DateTime.formatCustom
String -> DateTime -> String
Format a DateTime using a custom strftime format.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.formatCustom "%Y-%m-%d"Try itNotes: Uses strftime format specifiers (e.g., %Y for year, %m for month, %d for day).
See also: DateTime.format, DateTime.parseFormat
Components
DateTime.year
DateTime -> Int
Get the year component (e.g., 2024).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.yearTry itSee also: DateTime.month, DateTime.day
DateTime.month
DateTime -> Int
Get the month component (1-12).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.monthTry itSee also: DateTime.year, DateTime.day
DateTime.day
DateTime -> Int
Get the day component (1-31).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.dayTry itSee also: DateTime.year, DateTime.month
DateTime.hour
DateTime -> Int
Get the hour component (0-23).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.hourTry itSee also: DateTime.minute, DateTime.second
DateTime.minute
DateTime -> Int
Get the minute component (0-59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.minuteTry itSee also: DateTime.hour, DateTime.second
DateTime.second
DateTime -> Int
Get the second component (0-59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.secondTry itSee also: DateTime.hour, DateTime.minute
DateTime.weekday
DateTime -> Int
Get the weekday (1=Monday, 7=Sunday).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.weekdayTry itNotes: Uses ISO weekday numbering: 1=Monday through 7=Sunday.
See also: DateTime.dayOfYear, DateTime.weekNumber
DateTime.dayOfYear
DateTime -> Int
Get the day of year (1-366).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.dayOfYearTry itSee also: DateTime.weekday, DateTime.weekNumber
DateTime.weekNumber
DateTime -> Int
Get the ISO week number (1-53).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.weekNumberTry itSee also: DateTime.weekday, DateTime.dayOfYear
Manipulation
DateTime.addMillis
Int -> DateTime -> DateTime
Add milliseconds to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addMillis 5000Try itSee also: DateTime.addSeconds, DateTime.diffMillis
DateTime.addSeconds
Int -> DateTime -> DateTime
Add seconds to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addSeconds 60Try itSee also: DateTime.addMinutes, DateTime.diffSeconds
DateTime.addMinutes
Int -> DateTime -> DateTime
Add minutes to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addMinutes 30Try itSee also: DateTime.addHours, DateTime.diffMinutes
DateTime.addHours
Int -> DateTime -> DateTime
Add hours to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addHours 2Try itSee also: DateTime.addDays, DateTime.diffHours
DateTime.addDays
Int -> DateTime -> DateTime
Add days to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addDays 7Try itSee also: DateTime.addWeeks, DateTime.diffDays
DateTime.addWeeks
Int -> DateTime -> DateTime
Add weeks to a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addWeeks 2Try itSee also: DateTime.addDays, DateTime.addMonths
DateTime.addMonths
Int -> DateTime -> DateTime
Add months to a DateTime (handles month-end overflow).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addMonths 3Try itNotes: If the result day exceeds the target month's length, it clamps to the last day.
See also: DateTime.addYears, DateTime.addWeeks
DateTime.addYears
Int -> DateTime -> DateTime
Add years to a DateTime (handles leap year Feb 29).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.addYears 1Try itNotes: If the source date is Feb 29, adding a non-leap year clamps to Feb 28.
See also: DateTime.addMonths
Comparison
DateTime.isBefore
DateTime -> DateTime -> Bool
Check if the first DateTime is before the second.
import DateTime
DateTime.isBefore (DateTime.fromTimestamp 1000) (DateTime.fromTimestamp 2000)Try itSee also: DateTime.isAfter, DateTime.isEqual, DateTime.compare
DateTime.isAfter
DateTime -> DateTime -> Bool
Check if the first DateTime is after the second.
import DateTime
DateTime.isAfter (DateTime.fromTimestamp 2000) (DateTime.fromTimestamp 1000)Try itSee also: DateTime.isBefore, DateTime.isEqual, DateTime.compare
DateTime.isEqual
DateTime -> DateTime -> Bool
Check if two DateTimes are equal.
import DateTime
DateTime.isEqual (DateTime.fromTimestamp 1000) (DateTime.fromTimestamp 1000)Try itSee also: DateTime.isBefore, DateTime.isAfter, DateTime.compare
DateTime.compare
DateTime -> DateTime -> Int
Compare two DateTimes (-1 if before, 0 if equal, 1 if after).
import DateTime
DateTime.compare (DateTime.fromTimestamp 1000) (DateTime.fromTimestamp 2000)Try itSee also: DateTime.isBefore, DateTime.isAfter, DateTime.isEqual
Duration
DateTime.diffMillis
DateTime -> DateTime -> Int
Calculate the difference in milliseconds between two DateTimes.
import DateTime
let dt1 = DateTime.fromTimestamp 1700000000
let dt2 = DateTime.fromTimestamp 1700000060
DateTime.diffMillis dt1 dt2Try itSee also: DateTime.diffSeconds, DateTime.addMillis
DateTime.diffSeconds
DateTime -> DateTime -> Int
Calculate the difference in seconds between two DateTimes.
import DateTime
let dt1 = DateTime.fromTimestamp 1700000000
let dt2 = DateTime.fromTimestamp 1700000060
DateTime.diffSeconds dt1 dt2Try itSee also: DateTime.diffMinutes, DateTime.addSeconds
DateTime.diffMinutes
DateTime -> DateTime -> Int
Calculate the difference in minutes between two DateTimes.
import DateTime
let dt1 = DateTime.fromTimestamp 1700000000
let dt2 = DateTime.fromTimestamp 1700003600
DateTime.diffMinutes dt1 dt2Try itSee also: DateTime.diffHours, DateTime.addMinutes
DateTime.diffHours
DateTime -> DateTime -> Int
Calculate the difference in hours between two DateTimes.
import DateTime
let dt1 = DateTime.fromTimestamp 1700000000
let dt2 = DateTime.fromTimestamp 1700086400
DateTime.diffHours dt1 dt2Try itSee also: DateTime.diffDays, DateTime.addHours
DateTime.diffDays
DateTime -> DateTime -> Int
Calculate the difference in days between two DateTimes.
import DateTime
let dt1 = DateTime.fromTimestamp 1700000000
let dt2 = DateTime.fromTimestamp 1700086400
DateTime.diffDays dt1 dt2Try itSee also: DateTime.diffHours, DateTime.addDays
Calendar
DateTime.startOfDay
DateTime -> DateTime
Get the start of the day (00:00:00).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.startOfDayTry itSee also: DateTime.endOfDay
DateTime.endOfDay
DateTime -> DateTime
Get the end of the day (23:59:59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.endOfDayTry itSee also: DateTime.startOfDay
DateTime.startOfWeek
DateTime -> DateTime
Get the start of the week (Monday 00:00:00).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.startOfWeekTry itNotes: Week starts on Monday (ISO 8601).
See also: DateTime.endOfWeek
DateTime.endOfWeek
DateTime -> DateTime
Get the end of the week (Sunday 23:59:59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.endOfWeekTry itNotes: Week ends on Sunday (ISO 8601).
See also: DateTime.startOfWeek
DateTime.startOfMonth
DateTime -> DateTime
Get the start of the month (1st day 00:00:00).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.startOfMonthTry itSee also: DateTime.endOfMonth
DateTime.endOfMonth
DateTime -> DateTime
Get the end of the month (last day 23:59:59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.endOfMonthTry itSee also: DateTime.startOfMonth
DateTime.startOfYear
DateTime -> DateTime
Get the start of the year (Jan 1 00:00:00).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.startOfYearTry itSee also: DateTime.endOfYear
DateTime.endOfYear
DateTime -> DateTime
Get the end of the year (Dec 31 23:59:59).
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.endOfYearTry itSee also: DateTime.startOfYear
Other
DateTime.combine
Date -> Time -> DateTime
Combine a Date and Time into a DateTime (UTC).
import Date
import Time
import DateTime
case Date.fromYmd 2024 6 15 of
Ok date -> case Time.fromHms 14 30 0 of
Ok time -> DateTime.combine date time
Err _ -> DateTime.fromTimestamp 0
Err _ -> DateTime.fromTimestamp 0Try itNotes: Creates a UTC DateTime from the given Date and Time.
See also: DateTime.fromDateType, DateTime.getDate, DateTime.getTime
DateTime.fromDateType
Date -> DateTime
Convert a Date to a DateTime at midnight UTC.
import Date
import DateTime
case Date.fromYmd 2024 6 15 of
Ok date -> DateTime.fromDateType date
Err _ -> DateTime.fromTimestamp 0Try itNotes: Sets time to 00:00:00 UTC.
See also: DateTime.combine, DateTime.getDate
DateTime.getDate
DateTime -> Date
Extract the Date component from a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.getDateTry itSee also: DateTime.getTime, DateTime.fromDateType, DateTime.combine
DateTime.getTime
DateTime -> Time
Extract the Time component from a DateTime.
import DateTime
DateTime.fromTimestamp 1700000000
|> DateTime.getTimeTry itSee also: DateTime.getDate, DateTime.fromDateType, DateTime.combine