Daniel NĂ¼st
2011-Mar-10 16:17 UTC
[R] Timezone issue with strftime/strptime and %z and %Z
Hello! I've been trying to get this right for quite a while now and fear there is an easy solution I just don't see. I did not have this problem in Linux, and I searched r-help and Google but did not find a solution, but of course I am grateful for and resources I might not have found our not understood yet. I try to parse a time stamp with time zone. I essentially just want to parse the time stamp "1995-05-25T15:30:00+10:00" and output it exactly like it is, using the POSIX classes (or is that impossible?). Please find the script and output/comments below. Regards, Daniel> sessionInfo()R version 2.12.1 (2010-12-16) Platform: x86_64-pc-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252 [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C [5] LC_TIME=German_Germany.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rj_0.5.2-1 loaded via a namespace (and not attached): [1] rJava_0.8-8 tools_2.12.1> > t1 <- strptime("1995-05-25T15:30:00+10:00", format = "%Y-%m-%dT%H:%M:%OS") > t2 <- strptime("1995-05-25T15:30:00+10:00", format = "%Y-%m-%dT%H:%M:%OS%z") > > strftime(t1, format = "%Y-%m-%dT%H:%M:%OS")[1] "1995-05-25T15:30:00"> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z")[1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit"> # Ends in "Mitteleurop?ische Sommerzeit", not in +10:00, so time zone is ignored! > # Also no difference beetween %z and %z ! > strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%Z")[1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit"> # All this does NOT remove the "Mitteleurop?ische Zeit" from the strftime output!! > > # Can locale solve the problem? > Sys.getlocale(category = "LC_TIME")[1] "German_Germany.1252"> Sys.setlocale("LC_TIME", "English")[1] "English_United States.1252"> > strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z")[1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit"> # [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" -- No change. > > # does t1 actually have time zone? > attributes(t1)$names [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" $class [1] "POSIXlt" "POSIXt"> > format(t1, format = "%Y-%m-%dT%H:%M:%OS%z") # usetz = TRUE) # no change on usetz[1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit"> > # Is the : in offset the problem? > t3 <- strptime("1995-05-25T15:30:00+1000", format = "%Y-%m-%dT%H:%M:%S%z") > attributes(t3)$names [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" $class [1] "POSIXlt" "POSIXt"> format(t3, format = "%Y-%m-%dT%H:%M:%OS%z")[1] "1995-05-25T07:30:00Mitteleurop?ische Sommerzeit"> # [1] "1995-05-25T07:30:00Mitteleurop?ische Sommerzeit" > > strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z", tz = "+0200") # no effect on setting tz[1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit"> > Sys.setenv(TZ="GMT") # no working effect on format and strftime
David Winsemius
2011-Mar-11 01:46 UTC
[R] Timezone issue with strftime/strptime and %z and %Z
On Mar 10, 2011, at 11:17 AM, Daniel N?st wrote:> Hello! > > I've been trying to get this right for quite a while now and fear > there is an easy solution I just don't see. I did not have this > problem in Linux, and I searched r-help and Google but did not find a > solution, but of course I am grateful for and resources I might not > have found our not understood yet. > > I try to parse a time stamp with time zone. I essentially just want to > parse the time stamp "1995-05-25T15:30:00+10:00" and output it exactly > like it is, using the POSIX classes (or is that impossible?).Does this work? as.POSIXlt(gsub("T.*(\\+|\\-)..(:)", "", # get rid of the colon in the tz # but preserve the sign for the %z format string gsub("T", " ", "1995-05-25T15:30:00-1000")), # replace the "T" with a space format="%Y-%m-%d %H:%M:%S%z")> > Please find the script and output/comments below. > > Regards, > Daniel > > >> sessionInfo() > R version 2.12.1 (2010-12-16) > Platform: x86_64-pc-mingw32/x64 (64-bit) > > locale: > [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252 > [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C > [5] LC_TIME=German_Germany.1252 > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > > other attached packages: > [1] rj_0.5.2-1 > > loaded via a namespace (and not attached): > [1] rJava_0.8-8 tools_2.12.1 >> >> t1 <- strptime("1995-05-25T15:30:00+10:00", format = "%Y-%m-%dT%H: >> %M:%OS") >> t2 <- strptime("1995-05-25T15:30:00+10:00", format = "%Y-%m-%dT%H: >> %M:%OS%z") >> >> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS") > [1] "1995-05-25T15:30:00" >> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z") > [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" >> # Ends in "Mitteleurop?ische Sommerzeit", not in +10:00, so time >> zone is ignored! >> # Also no difference beetween %z and %z ! >> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%Z") > [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" >> # All this does NOT remove the "Mitteleurop?ische Zeit" from the >> strftime output!! >> >> # Can locale solve the problem? >> Sys.getlocale(category = "LC_TIME") > [1] "German_Germany.1252" >> Sys.setlocale("LC_TIME", "English") > [1] "English_United States.1252" >> >> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z") > [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" >> # [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" -- No change. >> >> # does t1 actually have time zone? >> attributes(t1) > $names > [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" > "isdst" > > $class > [1] "POSIXlt" "POSIXt" > >> >> format(t1, format = "%Y-%m-%dT%H:%M:%OS%z") # usetz = TRUE) # no >> change on usetz > [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" >> >> # Is the : in offset the problem? >> t3 <- strptime("1995-05-25T15:30:00+1000", format = "%Y-%m-%dT%H:%M: >> %S%z") >> attributes(t3) > $names > [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" > "isdst" > > $class > [1] "POSIXlt" "POSIXt" > >> format(t3, format = "%Y-%m-%dT%H:%M:%OS%z") > [1] "1995-05-25T07:30:00Mitteleurop?ische Sommerzeit" >> # [1] "1995-05-25T07:30:00Mitteleurop?ische Sommerzeit" >> >> strftime(t1, format = "%Y-%m-%dT%H:%M:%OS%z", tz = "+0200") # no >> effect on setting tz > [1] "1995-05-25T15:30:00Mitteleurop?ische Sommerzeit" >> >> Sys.setenv(TZ="GMT") # no working effect on format and strftime >-- David Winsemius, MD West Hartford, CT