Quick Start

This page covers the core Timestamp workflows most applications need first. The examples use @timestamp-js/core; optional calendar adapters use the same helper surface when you want adapter-native date fields.

Install


pnpm add @timestamp-js/core

Timestamp is ESM, side-effect free, and ships TypeScript declarations.

Parse a date

parseTimestamp() turns a date or date-time string into an immutable Timestamp object.

import { parseTimestamp } from '@timestamp-js/core'

const timestamp = parseTimestamp('2026-06-08 09:30')

timestamp?.date // '2026-06-08'
timestamp?.time // '09:30'
timestamp?.weekday // 1

Supported input includes date-only strings, space-separated date/time strings, ISO-style T separators, optional seconds, optional milliseconds, and optional timezone suffixes.

Get today

Use host-local helpers when the current runtime timezone should decide the date. Use UTC helpers when SSR, SSG, tests, or server/client parity need stable UTC fields.

import { nowUTC, today, todayUTC } from '@timestamp-js/core'

const localDate = today()
const utcDate = todayUTC()
const utcTimestamp = nowUTC()

For deterministic rendering, pass the Date source yourself:

import { nowUTC } from '@timestamp-js/core'

const renderedAt = new Date('2026-06-08T12:00:00.000Z')
const now = nowUTC(renderedAt)

Store a shared meeting time

Use instant helpers when users in different timezones should see the same meeting in their own local time. Convert the selected wall-clock time into UTC for storage, then convert it back for each viewer.

import { fromInstant, parseTimestamp, toInstant } from '@timestamp-js/core'

const selected = parseTimestamp('2026-07-03 09:00')!
const stored = toInstant(selected, 'America/Edmonton')

stored // '2026-07-03T15:00:00.000Z'
fromInstant(stored!, 'Europe/London')?.time // '16:00'

Invalid IANA timezone names and daylight-saving gaps return null, which lets forms reject times that cannot become a real UTC instant. When a fall-back transition repeats a local time, Timestamp chooses the earlier matching instant.

Format fields

Timestamp stores common formatted values directly on the object, and helper functions return the string forms used by UI components, routes, and storage keys.

import { getDate, getDateTime, getTime, parseTimestamp } from '@timestamp-js/core'

const timestamp = parseTimestamp('2026-06-08 09:30')!

getDate(timestamp) // '2026-06-08'
getTime(timestamp) // '09:30'
getDateTime(timestamp) // '2026-06-08 09:30'

Do date math

Timestamp helpers return new frozen objects. The original timestamp is not mutated.

import { addToDate, addToDateClamped, nextDay, parseTimestamp, prevDay } from '@timestamp-js/core'

const start = parseTimestamp('2026-01-31')!

nextDay(start).date // '2026-02-01'
prevDay(start).date // '2026-01-30'
addToDate(start, { month: 1 }).date // '2026-03-03'
addToDateClamped(start, { month: 1 }).date // '2026-02-28'

Use addToDateClamped() for month-end workflows where the result should stay inside the target month.

Create a day list

Calendar-style views often need a list of immutable day objects.

import { createDayList, parseTimestamp } from '@timestamp-js/core'

const start = parseTimestamp('2026-06-01')!
const end = parseTimestamp('2026-06-07')!

const days = createDayList(start, end)

days.map((day) => day.date)
// [
//   '2026-06-01',
//   '2026-06-02',
//   '2026-06-03',
//   '2026-06-04',
//   '2026-06-05',
//   '2026-06-06',
//   '2026-06-07',
// ]

Use a calendar adapter

Gregorian is the default. Pass a CalendarSystem when date fields should be native to another calendar.


pnpm add @timestamp-js/core @timestamp-js/calendar-islamic
import {
  getCalendarDirection,
  getCalendarWeekdays,
  parseCalendarTimestamp,
  today,
} from '@timestamp-js/core'
import { islamicCivilCalendar } from '@timestamp-js/calendar-islamic'

const visible = parseCalendarTimestamp('1445-09-15', islamicCivilCalendar)!
const currentHijriDate = today(islamicCivilCalendar)

visible.calendarId // 'islamic-civil'
visible.date // '1445-09-15'
currentHijriDate // current date in Islamic civil fields
getCalendarDirection(islamicCivilCalendar) // 'rtl'
getCalendarWeekdays(islamicCivilCalendar) // [6, 0, 1, 2, 3, 4, 5]

Adapter presentation defaults are recommendations. Components can use them when an app omits locale, dir, or weekdays, and the app can still override them for another language, direction, or a five-day work week.

Build adapter-native ranges

Use calendar-aware helpers when input and output dates belong to an adapter.

import {
  createCalendarDayList,
  getCalendarEndOfWeek,
  getCalendarStartOfWeek,
  getCalendarWeekdays,
  parseCalendarTimestamp,
} from '@timestamp-js/core'
import { islamicCivilCalendar } from '@timestamp-js/calendar-islamic'

const visible = parseCalendarTimestamp('1445-09-15', islamicCivilCalendar)!
const weekdays = getCalendarWeekdays(islamicCivilCalendar)

const weekStart = getCalendarStartOfWeek(visible, weekdays, islamicCivilCalendar)
const weekEnd = getCalendarEndOfWeek(visible, weekdays, islamicCivilCalendar)
const days = createCalendarDayList(weekStart, weekEnd, visible, islamicCivilCalendar)

weekStart.date // '1445-09-14'
weekEnd.date // '1445-09-20'
days.length // 7

Browser global usage

For CodePen-style usage, load the IIFE bundle and read helpers from the global object.

<script src="https://cdn.jsdelivr.net/npm/@timestamp-js/core@latest/dist/index.global.min.js"></script>
<script>
  const timestamp = TimestampJsCore.parseTimestamp('2026-06-08')

  console.log(timestamp?.date)
</script>

Optional adapters also ship browser-global bundles. Load core first, then the adapter bundle.

Next steps