githubEdit

Time

SOM provides support for Go's time-related types with automatic CBOR serialization for SurrealDB.

time.Time

Use time.Time for timestamps and dates:

import "time"

type Event struct {
    som.Node[som.ULID]

    Name      string
    StartTime time.Time
    EndTime   time.Time
}

CBOR Encoding

Internally, SOM uses a custom DateTime wrapper that handles CBOR serialization. Time values are encoded using:

  • CBOR Tag 12 for datetime values

  • Two-element array: [unix_seconds, nanoseconds]

This ensures nanosecond precision and proper round-tripping with SurrealDB.

Querying Time Fields

Time Filter Operations

Operation
Description

Before(time)

Before specified time

BeforeOrEqual(time)

Before or equal to

After(time)

After specified time

AfterOrEqual(time)

After or equal to

Add(duration)

Add duration to time

Sub(duration)

Subtract duration

Floor(duration)

Floor to duration unit

Round(duration)

Round to duration unit

Format(format)

Format as string

time.Duration

Use time.Duration for time intervals:

CBOR Encoding

Duration values are encoded using:

  • CBOR Tag 14 for duration values

  • Two-element array: [seconds, nanoseconds]

Working with Durations

Duration Filter Operations

Operation
Description

Before(duration)

Shorter than

After(duration)

Longer than

Add(duration)

Add durations

Sub(duration)

Subtract durations

Optional Time Fields

Use pointers for optional time values:

Query optional time fields:

Automatic Timestamps

Use som.Timestamps for automatic tracking:

  • CreatedAt - Set automatically on create (readonly)

  • UpdatedAt - Updated automatically on every save

Both fields are readonly in your application code and managed by SOM.

Timezone Handling

SOM stores times in UTC. Convert to local time when displaying:

Best practice: always work with UTC internally and convert for display only.

Examples

Event Scheduling

Session Expiry

Last updated