R/to_posixct_numeric.R

Defines functions to_posixct_numeric to_posixct_numeric.default to_posixct_numeric.Date to_posixct_numeric.POSIXct to_posixct_numeric.yearmon yearmon_to_POSIXct to_posixct_numeric.hms posixct_numeric_to_datetime dispatch_to_datetime dispatch_to_datetime.default dispatch_to_datetime.Date dispatch_to_datetime.yearmon dispatch_to_datetime.yearqtr dispatch_to_datetime.hms

#### TO POSIXct NUMERIC

to_posixct_numeric <- function(x) {
  UseMethod("to_posixct_numeric")
}

to_posixct_numeric.default <- function(x) {
  as.numeric(x)
}

to_posixct_numeric.Date <- function(x) {
  secs_in_day <- 86400
  as.numeric(.POSIXct(unclass(x) * secs_in_day, tz = get_default_time_zone()))
}

to_posixct_numeric.POSIXct <- function(x) {
  as.numeric(x)
}

to_posixct_numeric.yearmon <- function(x) {
  to_posixct_numeric(
    yearmon_to_POSIXct(x)
  )
}

# This is much faster than using as.POSIXct.yearmon which calls
# as.POSIXct.Date, it converts a character to a Date, very slow!
yearmon_to_POSIXct <- function(x) {
  x <- unclass(x)
  if (all(is.na(x))) {
    return(as.Date(x))
  }
  year  <- floor(x + 0.001)
  month <- floor(12 * (x - year) + 1 + 0.5 + 0.001)

  lubridate::make_datetime(year, month, 1, tz = get_default_time_zone())
}

# Same as yearmon, represented as a numeric internally, same as yearmon
to_posixct_numeric.yearqtr <- to_posixct_numeric.yearmon

to_posixct_numeric.hms <- function(x) {
  # No need to convert to POSIXct then numeric, this is just number of
  # seconds since epoch
  as.numeric(x)
}


#### FROM POSIXct NUMERIC

# Converting a posixct numeric time back to a classed datetime
posixct_numeric_to_datetime <- function(x, class = "POSIXct", ..., tz = NULL) {
  dispatch_obj <- make_dummy_dispatch_obj(class)
  dispatch_to_datetime(dispatch_obj, x, ..., tz = tz)
}

# This picks the datetime class to convert back to
dispatch_to_datetime <- function(dummy, x, ...) {
  UseMethod("dispatch_to_datetime")
}

dispatch_to_datetime.default <- function(dummy, x, ..., tz = NULL) {
  tz <- tz %||% get_default_time_zone()
  as.POSIXct(x, tz = tz, origin = "1970-01-01", ...)
}

dispatch_to_datetime.Date <- function(dummy, x, ..., tz = NULL) {
  tz <- tz %||% get_default_time_zone()
  as.Date(dispatch_to_datetime.default(dummy, x, tz = tz), tz = tz)
}

dispatch_to_datetime.yearmon <- function(dummy, x, ..., tz = NULL) {
  zoo::as.yearmon(dispatch_to_datetime.default(dummy, x, tz = tz))
}

dispatch_to_datetime.yearqtr <- function(dummy, x, ..., tz = NULL) {
  zoo::as.yearqtr(dispatch_to_datetime.default(dummy, x, tz = tz))
}

dispatch_to_datetime.hms <- function(dummy, x, ..., tz = NULL) {
  hms::as.hms(dispatch_to_datetime.default(dummy, x, tz = tz))
}
DavisVaughan/tibbletime3 documentation built on May 28, 2019, 12:25 p.m.