Users must specify which time units to measure the period
in. The exact length of each time unit in a period will
depend on when it occurs. See Period-class
and new_period
. The choice of units is not
trivial; units that are normally equal may differ in
length depending on when the time period occurs. For
example, when a leap second occurs one minute is longer
than 60 seconds. Because periods do not have a fixed length, they can not
be accurately converted to and from Duration objects.
Duration objects measure time spans in exact numbers of
seconds, see Duration-class
. Hence, a one
to one mapping does not exist between durations and
periods. When used with a Duration object, as.period
provides an inexact estimate; the duration is broken into
time units based on the most common lengths of time
units, in seconds. Because the length of months are
particularly variable, a period with a months unit can
not be coerced from a duration object. For an exact
transformation, first transform the duration to an
interval with as.interval
.
Coercing an interval to a period may cause surprising
behavior if you request periods with small units. A leap
year is 366 days long, but one year long. Such an
interval will convert to 366 days when unit is set to
days and 1 year when unit is set to years. Adding 366
days to a date will often give a different result than
adding one year. Daylight savings is the one exception
where this does not apply. Interval lengths are
calculated on the UTC timeline, which does not use
daylight savings. Hence, periods converted with seconds
or minutes will not reflect the actual variation in
seconds and minutes that occurs due to daylight savings.
These periods will show the "naive" change in seconds and
minutes that is suggested by the differences in clock
time. See the examples below.
as.period.difftime and as.period.duration display the
message "estimate only: convert difftimes (or duration)
to intervals for accuracy" by default. You can turn this
message off by setting the global
lubridate.verbose
option to FALSE with
options(lubridate.verbose = FALSE)
.