NarraLeaf

Time

Reading the clock, working with dates, and formatting a moment as text.

Fifteen pure nodes for reading the current time and working with dates. Now reads the clock. Make Time and Get Time Parts convert between a moment and its calendar fields. Add Time and Time Difference perform arithmetic that accounts for the length of each month. Four formatters turn a moment into text.

The common use is a save screen. To show when a slot was written, take Get Save Time into one of the formatters here.

Conventions

  • Every node on this page is Pure. None of them has an exec pin. Each is legal in event, function and macro graphs, and inside a Blueprint Value. A save slot's label is a Blueprint Value.
  • A moment is a number: milliseconds since 1 January 1970 UTC, on a float pin. This is the unit Get Save Time and Get Latest Auto Save produce, so a save's stamp wires straight into any node here.
  • There is no Time comparison node. A later moment is a larger number, so <, >, Min and Max in Math already order two moments.
  • The calendar is the player's local one. Make Time, Get Time Parts, Add Time, Time Difference, Start Of Day, Is Same Day and Format Time all read local time. To ISO String is the exception and outputs UTC.
  • Nothing is cached. A node runs again on every read, so Now gives a different answer to each edge that reads it.
  • A pin that is not a usable number reads as 0, meaning 1 January 1970. Format Time prints that date and reports nothing, so a formatter showing 1970 is reading an input that never arrived.

Now

blueprint.time.now · Pure

The current time.

PinDirectionTypeNotes
timestampout · datafloat

Make Time

blueprint.time.make · Pure

Builds a moment from local calendar fields.

PinDirectionTypeNotes
yearin · dataintegerAccepts an on-card literal. 50 means the year 50, not 1950.
monthin · datainteger1–12. Accepts an on-card literal.
dayin · datainteger1–31. Accepts an on-card literal.
hourin · datainteger0–23. Accepts an on-card literal.
minutein · datainteger0–59. Accepts an on-card literal.
secondin · datainteger0–59. Accepts an on-card literal.
millisecondin · datainteger0–999. Accepts an on-card literal.
timestampout · datafloat

A field outside its range carries into the next one. month 13 is January of the following year. day 0 is the last day of the previous month. Use it to reach the end of a month.

Get Time Parts

blueprint.time.parts · Pure

Splits a moment into local calendar fields.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
yearout · datainteger
monthout · datainteger1–12.
dayout · datainteger1–31.
hourout · datainteger0–23.
minuteout · datainteger0–59.
secondout · datainteger0–59.
millisecondout · datainteger0–999.
weekdayout · datainteger0 is Sunday, 6 is Saturday.
dayOfYearout · datainteger1 on 1 January.

Format Time

blueprint.time.format · Pure

Renders a moment as text using a pattern.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
patternin · datastringAccepts an on-card literal. YYYY-MM-DD HH:mm when left empty.
resultout · datastring
TokenProducesExample
YYYYFour-digit year2026
YYTwo-digit year26
MM / MMonth, padded or not08 / 8
DD / DDay, padded or not04 / 4
HH / HHour, 24-hour, padded or not15 / 15
hh / hHour, 12-hour, padded or not03 / 3
mm / mMinute, padded or not30 / 30
ss / sSecond, padded or not05 / 5
SSSMillisecond007
A / aHalf of the dayPM / pm

Anything that is not a token is copied through. Text between single quotes is copied through without being scanned for tokens, so a letter that is also a token can still be printed: 'Day' D gives Day 14. Two single quotes in a row print one quote.

Format Time Localized

blueprint.time.formatLocalized · Pure

Renders a moment in the conventions of a language.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
localein · datastringAccepts an on-card literal. A BCP 47 tag such as en-US or zh-CN. Empty means the player's system language.
resultout · datastring

On-card fields

FieldWhat
Date StyleNone, Short, Medium, Long or Full. Defaults to Medium.
Time StyleThe same five. Defaults to None.

With both styles set to None the result is empty. A tag the system does not recognise falls back to the player's language.

This node does not read the game's current language. Wire Get Current Language into locale to make the date follow the language the player selected.

Format Relative Time

blueprint.time.formatRelative · Pure

Describes the gap between two moments in words: 5 minutes ago, in 2 days.

PinDirectionTypeNotes
fromin · datafloatAccepts an on-card literal. The reference point, usually Now.
toin · datafloatAccepts an on-card literal. The moment being described.
localein · datastringAccepts an on-card literal. As in Format Time Localized.
resultout · datastring

On-card fields

FieldWhat
WordingAuto lets the language use words like yesterday. Always Numeric always counts. Defaults to Auto.

The unit follows the size of the gap: seconds below a minute, then minutes, hours, days, months, years.

Format Duration

blueprint.time.formatDuration · Pure

Renders a length of time as a clock reading.

PinDirectionTypeNotes
millisecondsin · datafloatAccepts an on-card literal.
resultout · datastring

On-card fields

FieldWhat
LayoutAuto shows hours only when there are any (1:05, 2:03:04). Hours Minutes Seconds always shows them (00:01:05). Minutes Seconds never does (01:05). Defaults to Auto.

Hours keep accumulating rather than rolling into days: thirty hours of play time reads 30:00:00.

The output is digits and separators. A wording such as 1 h 20 min needs a translation, so build it from Get Duration Parts and Format Text.

Get Duration Parts

blueprint.time.durationParts · Pure

Splits a length of time into units.

PinDirectionTypeNotes
millisecondsin · datafloatAccepts an on-card literal.
daysout · datainteger
hoursout · datainteger0–23.
minutesout · datainteger0–59.
secondsout · datainteger0–59.
remainingMillisecondsout · datainteger0–999.
totalHoursout · dataintegerThe whole span in hours.
totalMinutesout · dataintegerThe whole span in minutes.
totalSecondsout · dataintegerThe whole span in seconds.
negativeout · databoolean

Every number is a magnitude. The sign is reported by negative.

Add Time

blueprint.time.add · Pure

Moves a moment forward or back.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
amountin · datafloatAccepts an on-card literal. Negative moves back.
resultout · datafloat

On-card fields

FieldWhat
UnitMilliseconds, Seconds, Minutes, Hours, Days, Weeks, Months or Years. Defaults to Seconds.

Months and Years go through the calendar and stop at the end of the target month: 31 January plus one month is 28 February, or 29 in a leap year.

Time Difference

blueprint.time.difference · Pure

to minus from, measured in one unit.

PinDirectionTypeNotes
fromin · datafloatAccepts an on-card literal.
toin · datafloatAccepts an on-card literal.
differenceout · datafloatNegative when to is earlier than from.

On-card fields

FieldWhat
UnitAs in Add Time. Defaults to Seconds.

Fixed-length units keep the fraction. Ninety minutes measured in hours is 1.5; pass it through Floor for a whole number. Months and Years count whole calendar steps, so a gap one day short of a month is 0.

Parse Time

blueprint.time.parse · Pure

Reads a written date back into a moment.

PinDirectionTypeNotes
valuein · datastringAccepts an on-card literal.
timestampout · datafloat0 when the text could not be read.
okout · databoolean

ISO 8601 is the format to write. A date with no time, such as 2026-08-14, is read as local midnight.

Check ok. A failed parse produces 0, and 0 is also a valid moment in 1970.

To ISO String

blueprint.time.toIsoString · Pure

Writes a moment as an ISO 8601 string in UTC: 2026-08-14T07:30:00.000Z. Use it to put a time into a save's metadata or a persistent variable.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
resultout · datastring

Parse Time reads this back as the same moment.

Is Same Day

blueprint.time.isSameDay · Pure

Whether two moments fall on the same local calendar day.

PinDirectionTypeNotes
ain · datafloatAccepts an on-card literal.
bin · datafloatAccepts an on-card literal.
resultout · databoolean

The comparison is on the calendar day. 23:59 and 00:30 the next morning are half an hour apart and fall on different days.

Start Of Day

blueprint.time.startOfDay · Pure

Local midnight of the day a moment falls in.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal.
resultout · datafloat

Get Time Zone

blueprint.time.zoneOffset · Pure

The time zone the game is running in.

PinDirectionTypeNotes
timestampin · datafloatAccepts an on-card literal. The moment to ask about — daylight saving gives one zone different offsets through the year.
offsetMinutesout · datafloatMinutes ahead of UTC. 480 for UTC+8.
nameout · datastringAn IANA name such as Asia/Shanghai. Empty when the system does not report one.

Showing when a save was written

A slot's label is a Blueprint Value, and Get Save Time supplies the moment:

  • An absolute dateGet Save TimesavedAtFormat Time, or Format Time Localized to follow the player's language.
  • A relative dateNow into from, savedAt into to, then Format Relative Time.
  • Grouping by day — compare Start Of Day of the save against Start Of Day of Now, or use Is Same Day.

Read Get Save Time's exists pin to identify an empty slot. Its savedAt is 0 when there is no save, and 0 is also a valid moment.

On this page