Skip to main content
ZEN provides the d() function for comprehensive date handling with timezone support, arithmetic, comparisons, and formatting.

Creating dates

From string

d("2024-01-15")                    // 2024-01-15T00:00:00Z
d("2024-01-15 14:30")              // 2024-01-15T14:30:00Z
d("2024-01-15 14:30:45")           // 2024-01-15T14:30:45Z

With timezone

d("2024-01-15", "America/New_York")       // 2024-01-15T00:00:00-05:00
d("2024-01-15", "Europe/London")          // 2024-01-15T00:00:00Z
d("2024-01-15 14:30", "Asia/Tokyo")       // 2024-01-15T14:30:00+09:00

Current date/time

d()                               // Current date and time
d("America/Los_Angeles")          // Current time in LA timezone

Date components

Getters

MethodExampleResult
.year()d("2024-01-15").year()2024
.month()d("2024-01-15").month()1
.day()d("2024-01-15").day()15
.weekday()d("2024-01-15").weekday()1 (Monday)
.hour()d("2024-01-15 14:30").hour()14
.minute()d("2024-01-15 14:30").minute()30
.second()d("2024-01-15 14:30:45").second()45
.dayOfYear()d("2024-01-15").dayOfYear()15
.quarter()d("2024-01-15").quarter()1
.timestamp()d("2024-01-15").timestamp()1705276800000

Setters

d("2024-01-15").set("year", 2025)      // 2025-01-15
d("2024-01-15").set("month", 6)        // 2024-06-15
d("2024-01-15").set("day", 20)         // 2024-01-20

Date arithmetic

Adding time

d("2024-01-15").add("1d")              // 2024-01-16
d("2024-01-15").add("1w")              // 2024-01-22
d("2024-01-15").add("1M")              // 2024-02-15
d("2024-01-15").add("1y")              // 2025-01-15
d("2024-01-15").add("2d 5h")           // 2024-01-17T05:00:00

// Alternative syntax
d("2024-01-15").add(1, "d")            // 2024-01-16
d("2024-01-15").add(3, "M")            // 2024-04-15

Subtracting time

d("2024-01-15").sub("7d")              // 2024-01-08
d("2024-01-15").sub("1M")              // 2023-12-15
d("2024-01-15").sub(1, "y")            // 2023-01-15

Duration units

UnitAliases
Yeary, year, years
MonthM, month, months
Weekw, week, weeks
Dayd, day, days
Hourh, hour, hours
Minutem, minute, minutes
Seconds, second, seconds

Date comparisons

Comparison methods

d("2024-01-15").isBefore(d("2024-01-20"))         // true
d("2024-01-15").isAfter(d("2024-01-10"))          // true
d("2024-01-15").isSame(d("2024-01-15"))           // true
d("2024-01-15").isSameOrBefore(d("2024-01-15"))   // true
d("2024-01-15").isSameOrAfter(d("2024-01-15"))    // true

Comparison with granularity

d("2024-01-15").isSame(d("2024-01-20"), "month")    // true (same month)
d("2024-01-15").isSame(d("2024-06-15"), "year")     // true (same year)
d("2024-01-15").isBefore(d("2024-02-01"), "month")  // true

Comparison operators

d("2024-01-15") == d("2024-01-15")    // true
d("2024-01-15") != d("2024-01-20")    // true
d("2024-01-15") < d("2024-01-20")     // true
d("2024-01-15") > d("2024-01-10")     // true
d("2024-01-15") <= d("2024-01-15")    // true
d("2024-01-15") >= d("2024-01-15")    // true

Range checks

d("2024-01-15") in [d("2024-01-01")..d("2024-01-31")]     // true
d("2024-01-15") in (d("2024-01-01")..d("2024-01-31"))     // true
d("2024-02-15") not in [d("2024-01-01")..d("2024-01-31")] // true

Calculating differences

d("2024-01-15").diff("2024-01-10", "day")       // 5
d("2024-01-15").diff("2024-01-01", "week")      // 2
d("2024-06-15").diff("2024-01-15", "month")     // 5
d("2025-01-15").diff("2024-01-15", "year")      // 1
Negative differences when the first date is earlier:
d("2024-01-10").diff("2024-01-15", "day")       // -5

Start and end of periods

d("2024-01-15").startOf("day")      // 2024-01-15T00:00:00
d("2024-01-15").endOf("day")        // 2024-01-15T23:59:59
d("2024-01-15").startOf("month")    // 2024-01-01T00:00:00
d("2024-01-15").endOf("month")      // 2024-01-31T23:59:59
d("2024-01-15").startOf("year")     // 2024-01-01T00:00:00
d("2024-01-15").endOf("year")       // 2024-12-31T23:59:59
d("2024-01-15").startOf("week")     // 2024-01-15T00:00:00 (Monday)
d("2024-01-15").endOf("week")       // 2024-01-21T23:59:59 (Sunday)
d("2024-05-15").startOf("quarter")  // 2024-04-01T00:00:00
d("2024-05-15").endOf("quarter")    // 2024-06-30T23:59:59

Timezone conversion

d("2024-01-15T12:00:00Z").tz("America/New_York")    // 2024-01-15T07:00:00-05:00
d("2024-01-15T12:00:00Z").tz("Europe/London")       // 2024-01-15T12:00:00Z
d("2024-01-15T12:00:00Z").tz("Asia/Tokyo")          // 2024-01-15T21:00:00+09:00
Get timezone name:
d("2024-01-15", "America/New_York").offsetName()    // "America/New_York"

Relative dates

d().isToday()          // true if today
d().sub(1, "d").isYesterday()    // true
d().add(1, "d").isTomorrow()     // true

Validation

d("2024-01-15").isValid()         // true
d("invalid").isValid()            // false
d("2024-02-30").isValid()         // false (invalid date)
d(null).isValid()                 // false

Leap years

d("2024-01-15").isLeapYear()      // true
d("2023-01-15").isLeapYear()      // false
d("2000-01-15").isLeapYear()      // true
d("1900-01-15").isLeapYear()      // false

Formatting

d("2024-01-15").format("%Y-%m-%d")                    // "2024-01-15"
d("2024-01-15").format("%Y/%m/%d")                    // "2024/01/15"
d("2024-01-15T14:30:45Z").format("%A, %B %d %Y")      // "Monday, January 15 2024"
d("2024-01-15T14:30:45Z").format("%H:%M:%S")          // "14:30:45"

Format codes

CodeDescriptionExample
%Y4-digit year2024
%mMonth (01-12)01
%dDay (01-31)15
%HHour (00-23)14
%MMinute (00-59)30
%SSecond (00-59)45
%AFull weekdayMonday
%aAbbreviated weekdayMon
%BFull monthJanuary
%bAbbreviated monthJan
%jDay of year015

Min/max with dates

min([d("2024-01-15"), d("2024-03-20"), d("2024-02-10")])    // 2024-01-15
max([d("2024-01-15"), d("2024-03-20"), d("2024-02-10")])    // 2024-03-20

Common patterns

Age calculation

d().diff(birthDate, "year")

Days until expiration

d(expirationDate).diff(d(), "day")

Is within last 30 days

d(eventDate).isAfter(d().sub(30, "d"))

Business days check

d(orderDate).weekday() in [1..5]    // 1=Monday, 5=Friday