Guides / Working with time
Types of time
Pick the right type for a calendar day, a time of day, a specific moment, or a length of time.
JavaScript’s built-in Date uses one object for everything, whether you mean someone’s birthday, a 9:30 AM alarm, or the exact second an order was placed.
Each concept gets its own type so you only work with the parts you actually have:
CalendarDatefor a day on the calendar, like May 10, 2026Timefor a time of day, like 9:30 AMDateTimefor a specific moment in a time zoneDurationfor a length of time, like 2 hours or 3 weeks
CalendarDate
Use CalendarDate when something happens on a day rather than at a specific second: birthdays, due dates, holidays, or values from a date picker.
Create one with today() or date():
import { date, today } from 'native-dates';
const birthday = date('2026-05-10');
const due = today().plus(2, 'weeks');
birthday.month; // 5
birthday.day; // 10Because a CalendarDate has no clock or time zone, May 10 stays May 10 for every user regardless of where they live.
Time
Use Time for a time of day that isn’t tied to one specific date, such as store opening hours or a daily reminder.
import { time } from 'native-dates';
const opens = time('9:00am');
const closes = opens.plus(8, 'hours');
closes.hour; // 17
closes.format('short'); // '5:00 PM'Adding hours past midnight wraps around the 24-hour clock cleanly, since there is no date to advance.
DateTime
Use DateTime when something happens at a real point in time: a meeting, a flight departure, or a timestamp from your database.
Create one with now() or datetime(), or attach a time to a calendar date:
import { date, datetime, now } from 'native-dates';
const current = now();
const created = datetime('2026-11-16T17:30:00Z');
const standup = date('2026-11-16').at('9:30am', 'America/Los_Angeles');A DateTime knows both when something happens and which time zone you’re viewing it in. Call in() to see that same moment in another city:
standup.in('Europe/Berlin').format('time'); // '6:30 PM'Duration
Use Duration for how long something lasts. Create one with unit helpers like hours() or pass a phrase to duration():
import { days, duration, hours } from 'native-dates';
const call = hours(1.5);
const trial = days(14);
const turnaround = duration('2 weeks, 3 days');Measuring the gap between two values returns a Duration too:
const opens = time('9:00am');
const lunch = time('12:30pm');
opens.until(lunch).format('long'); // '3 hours, 30 minutes'Moving between them
These types connect directly when you add or drop parts. Attach a time to a CalendarDate with at() to get a DateTime:
const reminder = today().plus(1, 'day').at('9:00am');Going the other way, read the date or time off any DateTime:
reminder.date; // CalendarDate for tomorrow
reminder.time; // Time for 09:00:00DateTime or CalendarDate?
Ask whether changing time zones should change what the user sees. A 9:30 AM call in Los Angeles is 6:30 PM in Berlin, so it belongs in DateTime. A birthday on May 10 is still May 10 everywhere, so it belongs in CalendarDate.