%time()
Return the current time.
This function does too many things, and will be deprecated. We recommend using the other %time.*()
functions instead.
If no argument is passed, it returns the current time. Otherwise if the argument is:
-
dst
- returns abool
indicating whether or not the system is running in daylight savings time. -
mday_offset
- returns thetime_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 atime_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 thannow
!) -
wday_offset
- returns thetime_delta
offset since the start of the week. -
any other string is parsed as type
date
, using the normal date parsing routines.
Acct-Start-Time := %time(now)
The current time can also be compared to a known date:
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 |
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
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.
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.