Date and time code you can trust.

Join thousands of developers who stopped struggling with timezones. Tiempo makes Temporal conversions, formatting, and date math feel simple.

$ pnpm add @gobrand/tiempoRead the docs
UTC
PST
90
typed utilities
418
timezone identifiers
1 ns
Temporal precision
MIT
open source

The hard parts of time should feel simple.

Work in the timezone the business uses, move calendar days safely through DST, and return exact ISO back to your API.

Your team's timezone, anywhere

Convert an ISO timestamp into America/New_York, Asia/Tokyo, or UTC—regardless of where your code runs.

DST-safe calendar math

Adding a day means the next calendar day, not 24 hours. Your 9 AM schedule stays at 9 AM when clocks change.

A date is not a timestamp

Billing dates, birthdays, and holidays stay PlainDate values until you decide they represent a real moment.

Timezone mistakes get caught early

Autocomplete valid timezone names, including UTC, and keep invalid identifiers out of production.

Nanosecond precision

Keep exact API and database timestamps without routing them through Date's millisecond limit.

No hidden date mutations

Every operation returns a new value, so updating one schedule cannot quietly change another part of your app.

The usual time problems, solved.

Receive an ISO timestamp, work in the team's timezone, then send an exact ISO string back to your API.

Reschedule a team task without losing its timezone

The backend deals in ISO. The team deals in local calendar days. Tiempo makes that boundary explicit, safe through DST, and easy to send back.

import { addDays, endOfDay, format, toIso, toZonedTime } from '@gobrand/tiempo';
 
const teamTimezone = 'America/New_York';
 
// ISO from your backend → the team's calendar
// task.dueAt = "2026-03-07T15:00:00Z"
const dueAt = toZonedTime(task.dueAt, teamTimezone);
 
// "Tomorrow, end of day" stays correct through DST
const rescheduled = endOfDay(addDays(dueAt, 1));
 
format(rescheduled, "MMM d, h:mm a");
// → "Mar 8, 11:59 PM"
 
// Zoned value → exact UTC ISO back to the API
await api.tasks.update({ dueAt: toIso(rescheduled) });

Make time code obvious.

Use Temporal without making every call site solve Temporal from scratch. Install Tiempo and let the types carry the meaning.