• Start

Languages

/

JavaScript

/

API Reference

/

Data Types

Duration

Time duration values with support for multiple units and nanosecond precision.

The Duration class provides time duration values with nanosecond precision and support for human-readable formats like "5h30m".

Import:

import { Duration } from 'surrealdb';

Source: value/duration.ts

Create a new duration value.

Syntax

new Duration(duration) // Clone existing
new Duration(string) // Parse human-readable string
new Duration([seconds, nanoseconds]) // From tuple
ParameterTypeDescription
value Duration | string | [bigint, bigint]Value to create duration from.
// Parse human-readable durations
const fiveMinutes = new Duration('5m');
const oneHour = new Duration('1h');
const complex = new Duration('2h30m15s');
const precise = new Duration('1s500ms250us125ns');

// From tuple [seconds, nanoseconds]
const duration = new Duration([300n, 0n]); // 5 minutes

// Clone existing
const clone = new Duration(fiveMinutes);
UnitSymbolExample
Nanosecondsns"500ns"
Microsecondsus, µs"250us"
Millisecondsms"100ms"
Secondss"30s"
Minutesm"5m"
Hoursh"2h"
Daysd"7d"
Weeksw"4w"
Yearsy"1y"

Create a duration from a number of nanoseconds.

Syntax

Duration.nanoseconds(ns)
ParameterTypeDescription
ns number | bigintNumber of nanoseconds.

Duration - Duration representing the given nanoseconds

const d = Duration.nanoseconds(500);

Create a duration from a number of microseconds.

Syntax

Duration.microseconds(µs)
ParameterTypeDescription
µs number | bigintNumber of microseconds.

Duration - Duration representing the given microseconds

const d = Duration.microseconds(250);

Create a duration from a number of milliseconds.

Syntax

Duration.milliseconds(ms)
ParameterTypeDescription
ms number | bigintNumber of milliseconds.

Duration - Duration representing the given milliseconds

const d = Duration.milliseconds(1500);
console.log(d.toString()); // '1s500ms'

Create a duration from a number of seconds.

Syntax

Duration.seconds(s)
ParameterTypeDescription
s number | bigintNumber of seconds.

Duration - Duration representing the given seconds

const d = Duration.seconds(90);
console.log(d.toString()); // '1m30s'

Create a duration from a number of minutes.

Syntax

Duration.minutes(m)
ParameterTypeDescription
m number | bigintNumber of minutes.

Duration - Duration representing the given minutes

const d = Duration.minutes(5);
console.log(d.toString()); // '5m'

Create a duration from a number of hours.

Syntax

Duration.hours(h)
ParameterTypeDescription
h number | bigintNumber of hours.

Duration - Duration representing the given hours

const d = Duration.hours(2);
console.log(d.toString()); // '2h'

Create a duration from a number of days.

Syntax

Duration.days(d)
ParameterTypeDescription
d number | bigintNumber of days.

Duration - Duration representing the given days

const d = Duration.days(7);
console.log(d.toString()); // '1w'

Create a duration from a number of weeks.

Syntax

Duration.weeks(w)
ParameterTypeDescription
w number | bigintNumber of weeks.

Duration - Duration representing the given weeks

const d = Duration.weeks(4);
console.log(d.toString()); // '4w'

Create a duration from a number of years.

Syntax

Duration.years(y)
ParameterTypeDescription
y number | bigintNumber of years.

Duration - Duration representing the given years

const d = Duration.years(1);
console.log(d.toString()); // '1y'

Parse a duration from a float string with a unit suffix.

Syntax

Duration.parseFloat(input)
ParameterTypeDescription
input stringA float string with a unit suffix (e.g., "1.5s").

Duration - Parsed duration

const d = Duration.parseFloat('1.5s');
console.log(d.milliseconds); // 1500n

Returns a function that, when called, returns the elapsed Duration since the call to Duration.measure().

Syntax

Duration.measure()

() => Duration - A function that returns the elapsed duration

const elapsed = Duration.measure();

// ... perform some operation ...

const duration = elapsed();
console.log('Operation took:', duration.toString());

Property getters for accessing the total duration in specific units. All return bigint.

PropertyTypeDescription
nanosecondsbigintTotal nanoseconds
microsecondsbigintTotal microseconds
millisecondsbigintTotal milliseconds
secondsbigintWhole seconds
minutesbigintTotal whole minutes
hoursbigintTotal whole hours
daysbigintTotal whole days
weeksbigintTotal whole weeks
yearsbigintTotal whole years
const duration = new Duration('2h30m');

console.log(duration.hours); // 2n
console.log(duration.minutes); // 150n
console.log(duration.seconds); // 9000n
console.log(duration.milliseconds); // 9000000n
console.log(duration.nanoseconds); // 9000000000000n

Convert to human-readable string.

Syntax

duration.toString()

string - Human-readable duration string

const duration = new Duration('2h30m15s');
console.log(duration.toString()); // '2h30m15s'

Serialize for JSON.

Syntax

duration.toJSON()

string - Duration string for JSON

Convert to a compact tuple representation.

Syntax

duration.toCompact()

[bigint, bigint] | [bigint] | [] - Compact representation: [seconds, nanoseconds], [seconds] if nanoseconds is zero, or [] for a zero duration.

const d = new Duration('5m30s');
console.log(d.toCompact()); // [330n, 0n] or [330n]

Add another duration.

Syntax

duration.add(other)
ParameterTypeDescription
other DurationDuration to add.

Duration - Sum of durations

const base = new Duration('1h');
const extra = new Duration('30m');
const total = base.add(extra);
console.log(total.toString()); // '1h30m'

Subtract another duration.

Syntax

duration.sub(other)
ParameterTypeDescription
other DurationDuration to subtract.

Duration - Difference of durations

const total = new Duration('2h');
const part = new Duration('30m');
const remaining = total.sub(part);
console.log(remaining.toString()); // '1h30m'

Multiply a duration by a scalar.

Syntax

duration.mul(factor)
ParameterTypeDescription
factor number | bigintScalar to multiply by.

Duration - Scaled duration

const base = new Duration('30m');
const doubled = base.mul(2);
console.log(doubled.toString()); // '1h'

Divide a duration. Overloaded: dividing by a Duration returns the ratio as bigint, dividing by a number returns a new Duration.

Syntax

duration.div(divisor: Duration)       // Returns bigint (ratio)
duration.div(divisor: number | bigint) // Returns Duration
ParameterTypeDescription
divisor Duration | number | bigintDuration for ratio, or scalar for division.

bigint when dividing by a Duration, Duration when dividing by a number or bigint.

const total = new Duration('2h');
const unit = new Duration('30m');

// Ratio: how many 30m intervals in 2h?
const ratio = total.div(unit); // 4n

// Scalar division
const half = total.div(2);
console.log(half.toString()); // '1h'

Get the remainder after dividing by another duration.

Syntax

duration.mod(mod)
ParameterTypeDescription
mod DurationDuration to divide by.

Duration - Remainder after division

const total = new Duration('2h20m');
const interval = new Duration('1h');
const remainder = total.mod(interval);
console.log(remainder.toString()); // '20m'

Check if two durations are equal.

Syntax

duration.equals(other)

boolean - True if equal

import { Surreal, Duration, DateTime, Table } from 'surrealdb';

const db = new Surreal();
await db.connect('ws://localhost:8000');

// Set session timeout
const session = await db.create(new Table('sessions')).content({
user: userId,
created_at: DateTime.now(),
timeout: new Duration('24h')
});
// Set timeout on queries
const users = await db.select(new Table('users'))
.timeout(new Duration('5s'));

// Timeout on complex query
const result = await db.query(`
SELECT * FROM complex_view
`).timeout(new Duration('30s')).collect();
// Define rate limit window
const rateLimit = {
window: new Duration('1m'),
maxRequests: 100
};

// Store rate limit data
await db.create(new Table('rate_limits')).content({
user: userId,
window: rateLimit.window,
requests: 1,
window_start: DateTime.now()
});
// Schedule task with delay
const task = await db.create(new Table('tasks')).content({
name: 'Send email',
delay: new Duration('5m'),
created_at: DateTime.now()
});
// Set cache entry with TTL
const cacheEntry = await db.create(new Table('cache')).content({
key: 'user:123',
value: userData,
ttl: new Duration('1h'),
cached_at: DateTime.now()
});

// Check if cache is still valid
function isCacheValid(entry: typeof cacheEntry): boolean {
const elapsed = DateTime.now().milliseconds - entry.cached_at.milliseconds;
return elapsed < entry.ttl.milliseconds;
}
// Measure operation duration
const elapsed = Duration.measure();

// ... perform operation ...

const duration = elapsed();
console.log('Operation took:', duration.toString());
// Parse from string
const duration = new Duration('2h30m');

// Access as different units
const ms = duration.milliseconds; // 9000000n
const secs = duration.seconds; // 9000n
const mins = duration.minutes; // 150n
const hrs = duration.hours; // 2n

// Back to string
const str = duration.toString(); // '2h30m'

// Arithmetic
const doubled = duration.add(duration);
console.log(doubled.toString()); // '5h'
// Very precise timing
const precise = new Duration('1s500ms250us125ns');

// Multiple units
const complex = new Duration('1d2h30m15s');

// Arithmetic
const extended = complex.add(new Duration('12h'));
console.log(extended.toString()); // '1d14h30m15s'
// Create durations from numeric values
const timeout = Duration.seconds(30);
const cacheTTL = Duration.hours(1);
const retryDelay = Duration.milliseconds(500);
const oneWeek = Duration.weeks(1);

// Useful when values come from config or computation
const maxRetries = 3;
const backoff = Duration.seconds(2).mul(maxRetries);
// Good: Clear intent
const timeout = new Duration('30s');
const cacheTTL = new Duration('1h');

// Avoid: Raw numbers
const timeout = new Duration([30n, 0n]);
// Good: Type-safe duration arithmetic
const base = new Duration('1h');
const extended = base.add(new Duration('30m'));

// Good: Use static factories for computed values
const delay = Duration.seconds(retryCount * 2);
// Good: Store as Duration for type safety
await db.create(table).content({
timeout: new Duration('24h')
});

// Avoid: Store as number
await db.create(table).content({
timeout: 86400000 // What unit is this?
});
// Good: Use largest appropriate unit
const oneDay = new Duration('1d');
const oneWeek = new Duration('1w');

// Avoid: Unnecessary smaller units
const oneDay = new Duration('24h');
const oneWeek = new Duration('168h');
// Good: Built-in measurement
const elapsed = Duration.measure();
await performOperation();
console.log('Took:', elapsed().toString());

Was this page helpful?