Skip to content

Instantly share code, notes, and snippets.

@mpettis
Last active December 6, 2021 20:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mpettis/b4a7106f3e92beab14dc633a44c22702 to your computer and use it in GitHub Desktop.
Save mpettis/b4a7106f3e92beab14dc633a44c22702 to your computer and use it in GitHub Desktop.
Calculating UTC midnight during standard and DST
#;; Find the local midnight time in UTC for a given timezone
library(tidyverse)
library(lubridate)
library(glue)
# tgtTimezone <- "America/Chicago"
# tgtTimezone <- "America/Sao_Paulo"
# tgtYear <- 2021
#
# tibble(utc_dt = seq(ymd_hms(glue("{tgtYear}-01-01T00:00:00Z")),
# ymd_hms(glue("{tgtYear + 1}-01-01T00:00:00Z")),
# by="hour")) %>%
# mutate(local_dt = with_tz(utc_dt, tgtTimezone),
# utcLocalMidnightOffset = glue("{as_date(local_dt) + 1}T00:00:00") %>%
# ymd_hms(tz=tgtTimezone) %>%
# with_tz(tz="UTC") %>%
# hour()) %>%
# filter((utcLocalMidnightOffset != lag(utcLocalMidnightOffset)) | (row_number() == 1))
getMidnightDSTUTC <- function(tgtTimezone, tgtYear=year(now())) {
tibble(utc_dt = seq(ymd_hms(glue("{tgtYear}-01-01T00:00:00Z")),
ymd_hms(glue("{tgtYear + 1}-01-01T00:00:00Z")),
by="hour")) %>%
mutate(local_dt = with_tz(utc_dt, tgtTimezone),
utcLocalMidnight = glue("{as_date(local_dt) + 1}T00:00:00") %>%
ymd_hms(tz=tgtTimezone) %>%
with_tz(tz="UTC"),
utcLocalMidnightOffset = utcLocalMidnight %>%
hour()
) %>%
filter((utcLocalMidnightOffset != lag(utcLocalMidnightOffset)) | (row_number() == 1)) %>%
mutate(tz=tgtTimezone) %>%
select(tz, everything()) %>%
select(-utcLocalMidnightOffset)
}
getMidnightDSTUTC("America/Chicago", 2021)
getMidnightDSTUTC("America/Sao_Paulo", 2021)
dsts_df <-
c( "America/New_York",
"America/Chicago",
"America/Los_Angeles",
"America/Denver",
"America/Indiana/Indianapolis",
"America/Detroit",
"America/Phoenix",
"America/Kentucky/Louisville",
"America/Toronto",
"America/Vancouver",
"America/Monterrey",
"Pacific/Honolulu",
"America/Indiana/Petersburg",
"America/Indiana/Marengo",
"America/Sao_Paulo",
"America/Puerto_Rico",
"America/Mexico_City",
"America/Kentucky/Monticello",
"America/Indiana/Vincennes",
"America/Boise",
"Canada/Eastern",
"Asia/Singapore",
"Asia/Calcutta",
"America/Tijuana",
"America/Panama",
"America/Edmonton",
"America/Anchorage") %>%
map_dfr(~{
getMidnightDSTUTC(.x, 2021)
})
View(dsts_df)
#;; List local midnight start dates for all Olson Timezones
dsts_df <-
OlsonNames() %>%
map_dfr(~{
getMidnightDSTUTC(.x, 2021)
})
dsts_df %>%
select(tz, utcLocalMidnight) %>%
arrange(tz, utcLocalMidnight) %>%
group_by(tz) %>%
mutate(elt = row_number()) %>%
pivot_wider(names_from = "elt", values_from = "utcLocalMidnight") %>%
ungroup() %>%
set_names(c("tz", "jan", "first", "second")) #%>% write_csv(here::here("dat", "tz-change-listing.csv"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment