DateTimeLib — Date & Time Library

Comprehensive date and time operations for Plan9Basic. Get current date/time, convert between values and strings, extract components, calculate differences, add/subtract intervals, check calendar properties, and format output with custom patterns.

CategoryCountDescription
Current Date/Time9now, date, time, today, yesterday, tomorrow, etc.
Conversion7datetostr$, strtodate, timetostr$, formatdatetime$, etc.
Date Components7yearof, monthof, dayof, dayofweek, dayoftheyear, weekof, etc.
Time Components4hourof, minuteof, secondof, millisecondof
Differences (Whole)8daysbetween, hoursbetween, monthsbetween, yearsbetween, etc.
Differences (Fractional)8dayspan, hourspan, monthspan, yearspan, etc.
Incrementing7incday, inchour, incminute, incweek, incyear, etc.
Calendar Info6daysinamonth, daysinayear, weeksinayear, etc.
Boolean Tests5isam, ispm, isinleapyear, istoday, issameday

How Date/Time Values Work

In Plan9Basic, dates and times are numeric values (floating-point). The integer part is the date (days since Dec 30, 1899) and the fractional part is the time (fraction of a 24-hour day). So 0.5 = noon, 0.25 = 6:00 AM, 0.75 = 6:00 PM.

TypeDefault FormatExample
Dateyyyy-MM-dd2025-01-02
Timehh:mm:ss.zzz14:30:45.123
DateTimeyyyy-MM-dd hh:mm:ss2025-01-02 14:30:45

Getting Current Date & Time

FunctionSignatureDescription
now()now@Current date and time (numeric)
date()date@Current date only (midnight)
date$()date$@Current date as string yyyy-MM-dd
time()time@Current time only (fraction of day)
time$()time$@Current time as string hh:mm:ss.zzz
gettime()gettime@Same as time()
datetime$()datetime$@Current date/time as string
today()today@Today at midnight
yesterday()yesterday@Yesterday at midnight
tomorrow()tomorrow@Tomorrow at midnight
╯ plan9basic
println "Date: "; date$()
println "Time: "; time$()
println "Now:  "; datetime$()

dt = now()
println "Raw value: "; dt
println "Formatted: "; datetimetostr$(dt)

println "Yesterday: "; datetostr$(yesterday())
println "Tomorrow:  "; datetostr$(tomorrow())

Conversion Functions

FunctionSignatureDescription
datetostr$(n)datetostr$@nDate number → "yyyy-MM-dd"
strtodate(s$)strtodate@$"yyyy-MM-dd" → date number
timetostr$(n)timetostr$@nTime number → "hh:mm:ss.zzz"
strtotime(s$)strtotime@$"hh:mm:ss" → time number
datetimetostr$(n)datetimetostr$@nDateTime number → string
strtodatetime(s$)strtodatetime@$String → datetime number
formatdatetime$(fmt$, n)formatdatetime$@$nCustom formatted string
╯ plan9basic
d = strtodate("2025-12-25")
println "Christmas: "; datetostr$(d)

t = strtotime("09:30:00")
println "Morning: "; timetostr$(t)

dt = strtodatetime("2025-07-04 12:00:00")
println "July 4th noon: "; datetimetostr$(dt)

Date Component Extraction

FunctionSignatureDescription
yearof(n)yearof@nYear (e.g. 2025)
monthof(n)monthof@nMonth (1–12)
monthoftheyear(n)monthoftheyear@nSame as monthof
dayof(n)dayof@nDay of month (1–31)
dayofthemonth(n)dayofthemonth@nSame as dayof
dayofweek(n)dayofweek@nDay of week (1=Sun, 7=Sat)
dayoftheweek(n)dayoftheweek@nDay of week ISO (1=Mon, 7=Sun)
dayoftheyear(n)dayoftheyear@nDay of year (1–366)
weekof(n)weekof@nWeek of year (1–53)
weekoftheyear(n)weekoftheyear@nSame as weekof
weekofthemonth(n)weekofthemonth@nWeek within month (1–5)
╯ plan9basic
dt = now()
println "Year:  "; yearof(dt)
println "Month: "; monthof(dt)
println "Day:   "; dayof(dt)
println "Day of week:  "; dayofweek(dt); " (1=Sun)"
println "Day of week ISO: "; dayoftheweek(dt); " (1=Mon)"
println "Day of year: "; dayoftheyear(dt)
println "Week of year: "; weekof(dt)
ⓘ Note: dayofweek() uses Sunday=1 convention. dayoftheweek() uses ISO standard Monday=1.

Time Component Extraction

FunctionSignatureDescription
hourof(n)hourof@nHour (0–23)
minuteof(n)minuteof@nMinute (0–59)
secondof(n)secondof@nSecond (0–59)
millisecondof(n)millisecondof@nMillisecond (0–999)
╯ plan9basic
dt = now()
println "Hour:   "; hourof(dt)
println "Minute: "; minuteof(dt)
println "Second: "; secondof(dt)
println "Ms:     "; millisecondof(dt)

Date Arithmetic — Differences (Whole Units)

“Between” functions return the number of complete, whole units between two dates.

FunctionSignatureDescription
daysbetween(n1, n2)daysbetween@nnWhole days between dates
hoursbetween(n1, n2)hoursbetween@nnWhole hours between date/times
minutesbetween(n1, n2)minutesbetween@nnWhole minutes
secondsbetween(n1, n2)secondsbetween@nnWhole seconds
millisecondsbetween(n1, n2)millisecondsbetween@nnWhole milliseconds
weeksbetween(n1, n2)weeksbetween@nnWhole weeks
monthsbetween(n1, n2)monthsbetween@nnWhole months
yearsbetween(n1, n2)yearsbetween@nnWhole years
╯ plan9basic
d1 = strtodate("2025-01-01")
d2 = strtodate("2025-01-15")
println "Days: "; daysbetween(d1, d2)      ' 14

dt1 = strtodatetime("2025-01-01 10:00:00")
dt2 = strtodatetime("2025-01-01 14:30:00")
println "Hours: "; hoursbetween(dt1, dt2)  ' 4
println "Seconds: "; secondsbetween(dt1, dt2)  ' 16200

d3 = strtodate("2025-01-01")
d4 = strtodate("2025-01-22")
println "Weeks: "; weeksbetween(d3, d4)    ' 3

Date Arithmetic — Differences (Fractional)

“Span” functions return precise fractional differences (e.g. 4.5 hours instead of 4).

FunctionSignatureDescription
dayspan(n1, n2)dayspan@nnFractional days
hourspan(n1, n2)hourspan@nnFractional hours
minutespan(n1, n2)minutespan@nnFractional minutes
secondspan(n1, n2)secondspan@nnFractional seconds
millisecondspan(n1, n2)millisecondspan@nnFractional milliseconds
weekspan(n1, n2)weekspan@nnFractional weeks
monthspan(n1, n2)monthspan@nnFractional months
yearspan(n1, n2)yearspan@nnFractional years
╯ plan9basic
dt1 = strtodatetime("2025-01-01 10:00:00")
dt2 = strtodatetime("2025-01-01 14:30:00")
println "Hour span: "; hourspan(dt1, dt2)    ' 4.5

birthdate = strtodate("1990-06-15")
println "Precise age: "; yearspan(birthdate, today())
ⓘ Note: Use between functions when you need whole units (e.g. “14 days”). Use span functions when you need precision (e.g. “4.5 hours”).

Date Arithmetic — Incrementing

Add or subtract time units. Use negative values to go backwards.

FunctionSignatureDescription
incday(n, count)incday@nnAdd/subtract days
inchour(n, count)inchour@nnAdd/subtract hours
incminute(n, count)incminute@nnAdd/subtract minutes
incsecond(n, count)incsecond@nnAdd/subtract seconds
incmillisecond(n, count)incmillisecond@nnAdd/subtract milliseconds
incweek(n, count)incweek@nnAdd/subtract weeks
incyear(n, count)incyear@nnAdd/subtract years
╯ plan9basic
today = today()
println "Today:      "; datetostr$(today)
println "Next week:  "; datetostr$(incday(today, 7))
println "Last week:  "; datetostr$(incday(today, -7))
println "2 weeks:    "; datetostr$(incweek(today, 2))
println "Next year:  "; datetostr$(incyear(today, 1))
println "5 yrs ago:  "; datetostr$(incyear(today, -5))

dt = now()
println "3 hrs later:  "; datetimetostr$(inchour(dt, 3))
println "45 min later: "; datetimetostr$(incminute(dt, 45))

Calendar Information

FunctionSignatureDescription
daysinamonth(year, month)daysinamonth@nnDays in specific month
daysinmonth(n)daysinmonth@nDays in month of given date
daysinayear(year)daysinayear@nDays in specific year
daysinyear(n)daysinyear@nDays in year of given date
weeksinayear(year)weeksinayear@nWeeks in specific year
weeksinyear(n)weeksinyear@nWeeks in year of given date
╯ plan9basic
println "Feb 2024: "; daysinamonth(2024, 2)   ' 29 (leap)
println "Feb 2025: "; daysinamonth(2025, 2)   ' 28
println "Days 2024: "; daysinayear(2024)       ' 366
println "Days 2025: "; daysinayear(2025)       ' 365
println "Weeks 2025: "; weeksinayear(2025)

dt = now()
println "Current month days: "; daysinmonth(dt)
println "Current year days: "; daysinyear(dt)

Boolean Test Functions

All return 1 (true) or 0 (false).

FunctionSignatureDescription
isam(n)isam@nIs morning? (before noon)
ispm(n)ispm@nIs afternoon/evening? (noon or later)
isinleapyear(n)isinleapyear@nIs date in a leap year?
istoday(n)istoday@nIs the date today?
issameday(n1, n2)issameday@nnAre two date/times on the same day?
╯ plan9basic
dt = now()
if isam(dt) then
    println "Good morning!"
else
    println "Good afternoon!"
endif

d = strtodate("2024-06-15")
if isinleapyear(d) then
    println "2024 is a leap year"
endif

dt1 = strtodatetime("2025-01-02 09:00:00")
dt2 = strtodatetime("2025-01-02 18:30:00")
if issameday(dt1, dt2) then
    println "Same calendar day"
endif

Custom Formatting

FunctionSignatureDescription
formatdatetime$(fmt$, n)formatdatetime$@$nFormat with custom pattern

Format Specifiers

SpecifierDescriptionExample
yyyy4-digit year2025
yy2-digit year25
MM2-digit month01, 12
MMonth without leading zero1, 12
dd2-digit day01, 31
dDay without leading zero1, 31
hh2-digit hour (24h)00, 23
hHour without leading zero0, 23
nn2-digit minute00, 59
ss2-digit second00, 59
zzz3-digit millisecond000, 999
dddAbbreviated day nameMon, Tue
ddddFull day nameMonday
MMMAbbreviated month nameJan, Dec
MMMMFull month nameJanuary
AM/PMAM or PM indicatorAM, PM
╯ plan9basic
dt = now()

' US format
println formatdatetime$("MM/dd/yyyy", dt)

' European format
println formatdatetime$("dd/MM/yyyy", dt)

' Full date with time
println formatdatetime$("dddd, MMMM d, yyyy 'at' hh:nn AM/PM", dt)

' ISO format
println formatdatetime$("yyyy-MM-dd'T'hh:nn:ss", dt)

' Time only
println formatdatetime$("hh:nn:ss", dt)
⚠ Warning: Syntax is formatdatetime$("format", value) — format string first, then the date/time value. Not format$(value, "format").

Complete Examples

Age Calculator

╯ age_calc.bas
' Calculate age from a birthdate
birthdate = strtodate("1971-12-11")
today = today()

years = yearsbetween(birthdate, today)
println "Birthdate: "; datetostr$(birthdate)
println "Today: "; datetostr$(today)
println "Age: "; years; " years"
println "Precise: "; yearspan(birthdate, today); " years"

Working Days Calculator

╯ workdays.bas
' Count working days between two dates
function countWorkDays(startDate, endDate) local workDays, currentDate, dow
    workDays = 0
    currentDate = startDate
    
    while currentDate <= endDate
        dow = dayoftheweek(currentDate)
        if dow < 6 then
            workDays = workDays + 1
        endif
        currentDate = incday(currentDate, 1)
    endwhile
    
    return workDays
endfunction

d1 = strtodate("2025-01-01")
d2 = strtodate("2025-01-31")
println "From: "; datetostr$(d1)
println "To: "; datetostr$(d2)
println "Working days: "; countWorkDays(d1, d2)

Leap Year Checker

╯ leapyear.bas
' Check leap years for a range
for year = 2020 to 2030
    d = strtodate(str$(year) + "-01-01")
    if isinleapyear(d) = 1 then
        leapStr$ = "YES"
    else
        leapStr$ = "NO"
    endif
    println year; ": Leap? "; leapStr$; " ("; daysinayear(year); " days)"
next

Digital Clock Display

╯ clock.bas
' Display current time details
dt = now()

println "Date: "; formatdatetime$("dddd, MMMM d, yyyy", dt)
println ""
println "Time Components:"
println "  Hour:   "; hourof(dt)
println "  Minute: "; minuteof(dt)
println "  Second: "; secondof(dt)
println "  Ms:     "; millisecondof(dt)
println ""

if isam(dt) = 1 then
    println "Period: AM"
else
    println "Period: PM"
endif

println ""
println "Calendar:"
println "  Day of week: "; dayofweek(dt); " (1=Sun)"
println "  Day of year: "; dayoftheyear(dt)
println "  Week of year: "; weekoftheyear(dt)

New Year Countdown

╯ countdown.bas
' Countdown to New Year
today = now()
currentYear = yearof(today)
newYear = strtodatetime(str$(currentYear + 1) + "-01-01 00:00:00")

println "Now: "; datetimetostr$(today)
println "New Year: "; datetimetostr$(newYear)

days = daysbetween(today, newYear)
hours = hoursbetween(today, newYear) - (days * 24)

println ""
println "Time until New Year:"
println days; " days, "; hours; " hours"

Quick Reference

FunctionSignatureDescription
now() / date() / time()*@Current date/time (numeric)
date$() / time$() / datetime$()*$@Current date/time (string)
today() / yesterday() / tomorrow()*@Relative dates
datetostr$(n) / strtodate(s$)*@n/*@$Date ↔ string
timetostr$(n) / strtotime(s$)*@n/*@$Time ↔ string
datetimetostr$(n) / strtodatetime(s$)*@n/*@$DateTime ↔ string
formatdatetime$(fmt$, n)formatdatetime$@$nCustom format
yearof / monthof / dayof*of@nDate components
dayofweek(n)dayofweek@nDay of week (1=Sun)
dayoftheweek(n)dayoftheweek@nDay of week ISO (1=Mon)
dayoftheyear / weekof*@nCalendar position
hourof / minuteof / secondof / millisecondof*of@nTime components
*between(n1, n2)*between@nn8 whole-unit difference functions
*span(n1, n2)*span@nn8 fractional difference functions
inc*(n, count)inc*@nn7 increment functions
daysinamonth(yr, mo)daysinamonth@nnDays in specific month
daysinayear(yr) / weeksinayear(yr)*@nDays/weeks in specific year
isam / ispm / isinleapyear / istoday*@nBoolean tests (1/0)
issameday(n1, n2)issameday@nnSame calendar day?

61 functions across 9 categories.