R/GMToffset.R

#' Finds offset in hours from UTC for given time zone.
#'
#' @param timezone Required. A string containing the time zone. Works with
#' designated time zones such as \option{CST} and \option{MST} for Central
#' Standard or Mountain Standard time or offset time zones such as \option{etc/GMT+6}
#' or \option{etc/GMT+7} for Central Standard and Mountain Standard time. Does NOT
#' work with location time zones like \option{America/Regina}.
#'
#' @return Returns the offset in hours as a numeric value.
#' @author Kevin Shook
#' @note This code was based on the function \code{GMTOffsetFromTz} in the
#' package \pkg{oce}, but works for more time zones and returns a negative
#' value in the western hemisphere.
#' @importFrom stringr str_to_upper str_split_fixed str_detect
#' @export
#'
#' @examples
#' GMToffset('MST')
#' GMToffset('etc/GMT+6')
GMToffset <- function (timezone) {
  if(timezone == ''){
    cat('Error: time zone must be specfied\n')
    return(FALSE)
  }

  # convert to upper case
  timezone <- str_to_upper(timezone)


  # check for timezone string
  if (timezone == "A")
    return(1)
  if (timezone == "ACDT")
    return(10.5)
  if (timezone == "ACST")
    return(9.5)
  if (timezone == "ADT")
    return(-3)
  if (timezone == "AEDT")
    return(11)
  if (timezone == "AEST")
    return(10)
  if (timezone == "AKDT")
    return(-8)
  if (timezone == "AKST")
    return(-9)
  if (timezone == "AST")
    return(-4)
  if (timezone == "AWDT")
    return(9)
  if (timezone == "AWST")
    return(8)
  if (timezone == "B")
    return(2)
  if (timezone == "BST")
    return(1)
  if (timezone == "C")
    return(3)
  if (timezone == "CDT")
    return(-5)
  if (timezone == "CEDT")
    return(2)
  if (timezone == "CEST")
    return(2)
  if (timezone == "CET")
    return(1)
  if (timezone == "CST")
    return(-6)
  if (timezone == "CXT")
    return(7)
  if (timezone == "D")
    return(4)
  if (timezone == "E")
    return(5)
  if (timezone == "EDT")
    return(-4)
  if (timezone == "EEDT")
    return(3)
  if (timezone == "EEST")
    return(3)
  if (timezone == "EET")
    return(2)
  if (timezone == "EST")
    return(-5)
  if (timezone == "F")
    return(6)
  if (timezone == "G")
    return(7)
  if (timezone == "GMT")
    return(0)
  if (timezone == "H")
    return(8)
  if (timezone == "HAA")
    return(-3)
  if (timezone == "HAC")
    return(-5)
  if (timezone == "HADT")
    return(-9)
  if (timezone == "HAE")
    return(-4)
  if (timezone == "HAP")
    return(-7)
  if (timezone == "HAR")
    return(-6)
  if (timezone == "HAST")
    return(-10)
  if (timezone == "HAT")
    return(-2.5)
  if (timezone == "HAY")
    return(-8)
  if (timezone == "HNA")
    return(-4)
  if (timezone == "HNC")
    return(-6)
  if (timezone == "HNE")
    return(-5)
  if (timezone == "HNP")
    return(-8)
  if (timezone == "HNR")
    return(-7)
  if (timezone == "HNT")
    return(-3.5)
  if (timezone == "HNY")
    return(-9)
  if (timezone == "I")
    return(9)
  if (timezone == "IST")
    return(1)
  if (timezone == "K")
    return(10)
  if (timezone == "L")
    return(11)
  if (timezone == "M")
    return(12)
  if (timezone == "MDT")
    return(-6)
  if (timezone == "MESZ")
    return(2)
  if (timezone == "MEZ")
    return(1)
  if (timezone == "MST")
    return(-7)
  if (timezone == "N")
    return(-1)
  if (timezone == "NDT")
    return(-2.5)
  if (timezone == "NFT")
    return(11.5)
  if (timezone == "NST")
    return(-3.5)
  if (timezone == "O")
    return(-1)
  if (timezone == "P")
    return(-3)
  if (timezone == "PDT")
    return(-7)
  if (timezone == "PST")
    return(-8)
  if (timezone == "Q")
    return(-4)
  if (timezone == "R")
    return(-4)
  if (timezone == "S")
    return(-6)
  if (timezone == "T")
    return(-7)
  if (timezone == "U")
    return(-8)
  if (timezone == "UTC")
    return(0)
  if (timezone == "V")
    return(-9)
  if (timezone == "W")
    return(-10)
  if (timezone == "WDT")
    return(9)
  if (timezone == "WEDT")
    return(1)
  if (timezone == "WEST")
    return(1)
  if (timezone == "WET")
    return(0)
  if (timezone == "WST")
    return(8)
  if (timezone == "X")
    return(-11)
  if (timezone == "Y")
    return(-12)
  if (timezone == "Z")
    return(0)
  if (timezone == "YST")
    return(-8)

  # check for etc
  if (str_detect(timezone, 'ETC')){
    pieces <- str_split_fixed(timezone,'GMT', 2)
    return(-1*as.numeric(pieces[2]))
  }
  else{
    stop('Could not find time zone')
  }


}
CentreForHydrology/CRHMr documentation built on April 6, 2024, 5:27 p.m.