Description of the classes
representing calendar dates and times.
"print"(x, ...)"summary"(object, digits = 15, ...)time + z z + time time - z time1 lop time2
- x, object
- An object to be printed or summarized from one of the date-time classes.
- Number of significant digits for the computations: should be high enough to represent the least important time unit exactly.
- Further arguments to be passed from or to other methods.
- date-time objects
- time1, time2
- date-time objects or character vectors. (Character
vectors are converted by
- a numeric vector (in seconds)
- One of
There are two basic classes of date/times. Class
represents the (signed) number of seconds since the beginning of 1970
(in the UTC time zone) as a numeric vector. Class
a named list of vectors representing
- 0--61: seconds.
- 0--59: minutes.
- 0--23: hours.
- 1--31: day of the month.
- 0--11: months after the first of the year.
- years since 1900.
- 0--6 day of the week, starting on Sunday.
- 0--365: day of the year.
- Daylight Saving Time flag. Positive if in force, zero if not, negative if unknown.
(There may be other components). Note that the internal list
structure is somewhat hidden, as many methods (including
apply to the abstract date-time vector, as for
classes correspond to the POSIX/C99 constructs of calendar
time_t data type) and local time (or
broken-down time, the
struct tm data type), from which they
also inherit their names. The components of
integer vectors, except
"POSIXct" is more convenient for including in data frames, and
"POSIXlt" is closer to human-readable forms. A virtual class
"POSIXt" exists from which both of the classes inherit: it is
used to allow operations such as subtraction to mix the two classes.
"POSIXlt" are for
information, and are not used in the conversion to calendar time.
isdst is needed to distinguish times at the end of
DST: typically 1am to 2am occurs twice, first in DST and then in
standard time. At all other times
isdst can be deduced from
the first six values, but the behaviour if it is set incorrectly is
Logical comparisons and some arithmetic operations are available for
both classes. One can add or subtract a number of seconds from a
date-time object, but not add two date-time objects. Subtraction of
two date-time objects is equivalent to using
Be aware that
"POSIXlt" objects will be interpreted as being in
the current time zone for these operations unless a time zone has been
"POSIXlt" objects will often have an attribute
a character vector of length 3 giving the time zone name from the
TZ environment variable and the names of the base time zone
and the alternate (daylight-saving) time zone. Sometimes this may
just be of length one, giving the time zone name.
"POSIXct" objects may also have an attribute
character vector of length one. If set to a non-empty value, it will
determine how the object is converted to class
"POSIXlt" and in
particular how it is printed. This is usually desirable, but if you
want to specify an object in a particular time zone but to be printed
in the current time zone you may want to remove the
attribute (e.g. by
Unfortunately, the conversion is complicated by the operation of time
zones and leap seconds (25 days have been 86401 seconds long so far:
the times of the extra seconds are in the object
.leap.seconds). The details of this are entrusted to the OS
services where possible. It seems that some rare systems used to use
leap seconds, but all known current platforms ignore them (as required
by POSIX). This is detected and corrected for at build time, so
"POSIXct" times used by R do not include leap seconds on any
"POSIXlt" objects converts them to the
current time zone, and on
"POSIXct" objects drops any
"tzone" attributes (even if they are all marked with the same
A few times have specific issues. First, the leap seconds are ignored,
and real times such as
"2005-12-31 23:59:60" are (probably)
treated as the next second. However, they will never be generated by
R, and are unlikely to arise as input. Second, on some OSes there is
a problem in the POSIX/C99 standard with
"1969-12-31 23:59:59 UTC",
-1 in calendar time and that value is on those OSes
also used as an error code. Thus
23:59:59", format = "%Y-%m-%d %H:%M:%S", tz = "UTC") may give
NA, and hence
tz = "UTC") will give
"1969-12-31 23:59:00". Other OSes
(including the code used by R on Windows) report errors separately
and so are able to handle that time as valid.
The print methods respect
"POSIXlt" are able to express
fractions of a second. (Conversion of fractions between the two forms
may not be exact, but will have better than microsecond accuracy.) Fractional seconds are printed only if
options("digits.secs") is set: see
Valid ranges for times
"POSIXlt" class can represent a very wide range of times (up
to billions of years), but such times can only be interpreted with
reference to a time zone. concept of time zones was first adopted in the nineteenth century, and
the Gregorian calendar was introduced in 1582 but not universally
adopted until 1927. OS services almost invariably assume the
Gregorian calendar and may assume that the time zone that was first
enacted for the location was in force before that date. (The earliest
legislated time zone seems to have been London on 1847-12-01.) Some
OSes assume the previous use of local time based on the
longitude of a location within the time zone. Most operating systems represent
POSIXct times as C type
long. This means that on 32-bit OSes this covers the period
1902 to 2037. On most 64-bit platforms, the range of representable
times is billions of years. A few benighted OSes used a unsigned type
and so cannot represent times before 1970. Currently OS services are used from 1902 (or 1970) to 2037: outside
the limits we use our own C code. This uses the offset from GMT in
use either for 1902 (when there was no DST) or that predicted for one
of 2030 to 2037 (chosen so that the likely DST transition days are
Sundays), and uses the alternate (daylight-saving) time zone only if
isdst is positive or (if
-1) if DST was predicted to be
in operation in the 2030s on that day. There is no reason to suppose that the DST rules will remain the same
in the future, and indeed the US legislated in 2005 to change its
rules as from 2007, with a possible future reversion. So conversions
for times more than a year or two ahead are speculative.
Some Unix-like systems (especially Linux ones) do not have environment
variable TZ set, yet have internal code that expects it (as does
POSIX). We have tried to work around this, but if you get unexpected
results try setting TZ. See
valid settings. Great care is needed when comparing objects of class
Not only are components and attributes optional; several components
may have values meaning not yet determined and the same time
represented in different time zones will look quite different.
Ripley, B. D. and Hornik, K. (2001) Date-time classes. R News, 1/2, 8--11. http://www.r-project.org/doc/Rnews/Rnews_2001-2.pdf
Dates for dates without times.
strptime for conversion to and from character
Sys.time for clock time as a
difftime for time intervals.
weekdays for convenience extraction functions.