FreeRADIUS InkBridge

%time()

Return the current time.

This function does too many things, and will be deprecated. We recommend using the other %time.*() functions instead.

Return: date.

If no argument is passed, it returns the current time. Otherwise if the argument is:

  • dst - returns a bool indicating whether or not the system is running in daylight savings time.

  • mday_offset - returns the time_delta offset since the start of the month. Use %d to get an integer representing the day of the month.

  • now - returns the current time

  • offset - returns a time_delta of the current time zone offset. This value may be negative.

  • request - returns the time at which the request packet was received (always less than now!)

  • wday_offset - returns the time_delta offset since the start of the week.

  • any other string is parsed as type date, using the normal date parsing routines.

Example
Acct-Start-Time := %time(now)

The current time can also be compared to a known date:

Example
if (%time() < (date) 'Aug 1 2023 01:02:03 UTC') {
	...
}

The format of the date strings should be the same format as the server prints out. The parse will try to accept other date formats (raw integer, etc.), but not all formats are guaranteed to work. There are hundreds of different date formats used across the world, and the server cannot support them all.

This expansion should be used in preference to the single letter expansions %l. That expansion returns integer seconds, and is not suitable for millisecond or microsecond resolution.

Due to limitations in the underlying time functions (both system and FreeRADIUS), previous versions of FreeRADIUS did not always handle dates correctly. When print dates, the time zone information would sometimes not be printed, or the time zone would sometimes be ignored when parsed a date from a string.

Even if the time zone was used, the nature of time zones means that there may be duplicate time zone names! For example, the time zone CST has three separate (and different) definitions.

The server now tracks all times internally as UTC, and by default prints times as UTC, or prints the time zone as a decimal offset from UTC, instead of printing an ambiguous name.

This handling of time zones has some minor side effects. When calculating values like "tomorrow", the default is to return the UTC version of "tomorrow". This value may not be what you want.

In order to correctly calculate the local value of "tomorrow", it is necessary to add the local time zone offset to the UTC time.

Note that the server will automatically determine (and use) any daylight savings time differences. So the value of %time(offset) may change while the server is running!

The following example calculates the correct value of "tomorrow" in UTC by using the following steps:

  • taking the current time of the request

  • calculating how long it has been since the start of the day as a time_delta

  • subtracting that time_delta from the current time

Example Calculating the UTC value of "tomorrow"
group {
    date now
    date tomorrow
    time_delta time_of_day

    now := %time('request')

    #  We are this many seconds into one day
    time_of_day := now % (time_delta) 1d

    # calculate the start of today, and then add one day to that
    tomorrow := now - time_of_day + (time_delta) 1d
}

The following example calculates the correct value of "tomorrow" in local time by using the preceding example, but then adding the local time zone offset to the final value.

Example Calculating the local value of "tomorrow"
group {
    date now
    date tomorrow
    time_delta time_of_day

    now := %time('request')

    #  We are this many seconds into one day
    time_of_day := now % (time_delta) 1d

    # calculate the start of today, and then add one day to that
    tomorrow := now - time_of_day + (time_delta) 1d

    #  add in the time zone offset
    tomorrow += %time('offset')
}

This kind of math works well for "tomorrow", but it is less useful for "next week Monday", or "start of next month". The %time.next(…​) expansion above should be used for those time operations.