Reputation: 3199
I'm facing difficulties converting a date-time string with a timezone offset to local time in R. The date-time string I have is in the following format: "2021-01-05T09:00:00+01:00". I want to convert it to the local time in the timezone specified by the offset (+01:00), which corresponds to Paris time (Europe/Paris) during the winter (CET - Central European Time).
I've tried using various methods, including lubridate and as.POSIXct() with the %z format. However, these attempts did not produce the correct result. For example, when using lubridate, the output is "2021-01-05 08:00:00 CET" instead of "2021-01-05 09:00:00 CET". I also attempted using strptime() with the same format, but the result remains incorrect.
Here's the R code I've tried so far:
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- ymd_hms(moment) %>% force_tz(tzone = "Europe/Paris")
print(date_obj) # Output: "2021-01-05 08:00:00 CET"
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- ymd_hms(moment) %>% with_tz(tzone = "Europe/Paris")
print(date_obj) # Output: "2021-01-05 09:00:00 CET"
# Using as.POSIXct()
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S%z")
print(date_obj) # Output: NA
# Using strptime()
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- strptime(moment, format = "%Y-%m-%dT%H:%M:%S%z")
print(date_obj) # Output: NA
Could someone please provide a clear and accurate solution to convert this date-time string to the local time in Paris (CET) with the specified timezone offset? Any help or suggestions would be greatly appreciated.
Thank you!
Upvotes: 0
Views: 272
Reputation: 269644
Specify the format up to seconds and separately specify the time zone. No packages are used.
moment <- "2021-01-05T09:00:00+01:00"
as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S", tz = "Europe/Paris")
## [1] "2021-01-05 09:00:00 CET"
or
as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S", tz = "CET")
## [1] "2021-01-05 09:00:00 CET"
or extract +01:00 and transform it to Etc/GMT-1 (note sign flip):
as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S",
tz = chartr("+-", "-+", sub(".*([+-])0?(.*):..$", "Etc/GMT\\1\\2", moment)))
## [1] "2021-01-05 09:00:00 +01"
Upvotes: 2