R Under development (unstable) (2022-11-09 r83320) -- "Unsuffered Consequences" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: aarch64-apple-darwin22.1.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ### more date-time tests where the output is to be checked. > > ## Expect differences, especially for platforms without tm_zone/tm_gmtoff. > > options(warn = 1L) > > ## tests of "POSIXlt" objects > xU <- strptime("2022-01-01", "%Y-%m-%d", tz = "UTC") > xU [1] "2022-01-01 UTC" > str(unclass(xU)) List of 11 $ sec : num 0 $ min : int 0 $ hour : int 0 $ mday : int 1 $ mon : int 0 $ year : int 122 $ wday : int 6 $ yday : int 0 $ isdst : int 0 $ zone : chr "UTC" $ gmtoff: int 0 - attr(*, "tzone")= chr "UTC" - attr(*, "balanced")= logi TRUE > > x0 <- strptime("2022-01-01", "%Y-%m-%d") > x0 [1] "2022-01-01 GMT" > str(unclass(x0)) List of 11 $ sec : num 0 $ min : int 0 $ hour : int 0 $ mday : int 1 $ mon : int 0 $ year : int 122 $ wday : int 6 $ yday : int 0 $ isdst : int 0 $ zone : chr "GMT" $ gmtoff: int NA - attr(*, "tzone")= chr [1:3] "" "GMT" "BST" - attr(*, "balanced")= logi TRUE > > x1 <- strptime("2022-07-01", "%Y-%m-%d", tz = "Europe/London") > x1 [1] "2022-07-01 BST" > str(unclass(x1)) # gmtoff is NA List of 11 $ sec : num 0 $ min : int 0 $ hour : int 0 $ mday : int 1 $ mon : int 6 $ year : int 122 $ wday : int 5 $ yday : int 181 $ isdst : int 1 $ zone : chr "BST" $ gmtoff: int NA - attr(*, "tzone")= chr [1:3] "Europe/London" "GMT" "BST" - attr(*, "balanced")= logi TRUE > > ## give offset value -- makes most sense in UTC > x2 <- strptime("2022-07-01 10:55:03 +0300", "%Y-%m-%d %H:%M:%S %z", tz = "UTC") > x2 [1] "2022-07-01 07:55:03 UTC" > str(unclass(x2)) List of 11 $ sec : num 3 $ min : int 55 $ hour : int 7 $ mday : int 1 $ mon : int 6 $ year : int 122 $ wday : int 5 $ yday : int 181 $ isdst : int 0 $ zone : chr "UTC" $ gmtoff: int 0 - attr(*, "tzone")= chr "UTC" - attr(*, "balanced")= logi TRUE > ## in another tzone it will report the time in that zone, with its DST .... > x3 <- strptime("2022-07-01 10:55:03 +0300", "%Y-%m-%d %H:%M:%S %z", + tz = "Europe/Vienna") > x3 [1] "2022-07-01 09:55:03" > str(unclass(x3)) List of 11 $ sec : num 3 $ min : int 55 $ hour : int 9 $ mday : int 1 $ mon : int 6 $ year : int 122 $ wday : int 5 $ yday : int 181 $ isdst : int 1 $ zone : chr "" $ gmtoff: int NA - attr(*, "tzone")= chr [1:3] "Europe/Vienna" "CET" "CEST" - attr(*, "balanced")= logi TRUE > > x4 <- strptime("2022-07-01", "%Y-%m-%d", tz ="Pacific/Fiji") > x4 [1] "2022-07-01 +12" > str(unclass(x4)) # abbreviations may be numbers. List of 11 $ sec : num 0 $ min : int 0 $ hour : int 0 $ mday : int 1 $ mon : int 6 $ year : int 122 $ wday : int 5 $ yday : int 181 $ isdst : int 0 $ zone : chr "+12" $ gmtoff: int NA - attr(*, "tzone")= chr [1:3] "Pacific/Fiji" "+12" "+13" - attr(*, "balanced")= logi TRUE > # Kiribati does/did not have DST, so second abbreviation may be repeat or empty > x5 <- strptime("2022-07-01", "%Y-%m-%d", tz ="Pacific/Kiritimati") > x5 [1] "2022-07-01 +14" > str(unclass(x5)) # does not have DST, hence no DST abbreviation on some platforms List of 11 $ sec : num 0 $ min : int 0 $ hour : int 0 $ mday : int 1 $ mon : int 6 $ year : int 122 $ wday : int 5 $ yday : int 181 $ isdst : int 0 $ zone : chr "+14" $ gmtoff: int NA - attr(*, "tzone")= chr [1:3] "Pacific/Kiritimati" "+14" " " - attr(*, "balanced")= logi TRUE > > ## edge of range and out of range offsets > strptime("2022-01-01 +1400", "%Y-%m-%d %z", tz = "UTC") [1] "2021-12-31 10:00:00 UTC" > strptime("2022-01-01 -1400", "%Y-%m-%d %z", tz = "UTC") [1] "2022-01-01 14:00:00 UTC" > strptime("2022-01-01 +1500", "%Y-%m-%d %z", tz = "UTC") Warning in strptime("2022-01-01 +1500", "%Y-%m-%d %z", tz = "UTC") : values for %z outside +/-1400 are an error [1] NA > strptime("2022-01-01 -1500", "%Y-%m-%d %z", tz = "UTC") Warning in strptime("2022-01-01 -1500", "%Y-%m-%d %z", tz = "UTC") : values for %z outside +/-1400 are an error [1] NA > > > ## extreme values for as.Date (negative ones were wrong in R 4.2.2) > as.Date(2^(30:33)) [1] "2941775-04-07" "5881580-07-12" "11761191-01-21" "23520412-02-10" > as.Date(-2^(30:33)) [1] "-2937836-09-26" "-5877641-06-23" "-11757252-12-12" "-23516473-11-23" > ## tm$year will overflow ints in less than 800 milion years from present. > as.Date(c(7e11, 8e11, -7e11, -8e11)) [1] "1916536874-11-22 00:00:00" NA [3] "-1916532935-02-09 00:00:00" NA > > > ## handling of names > # conversion of R objects > x <- seq(as.Date("2022-09-01"), by = "weeks", length = 10) > names(x) <- paste("week", 1:10) > x week 1 week 2 week 3 week 4 week 5 week 6 "2022-09-01" "2022-09-08" "2022-09-15" "2022-09-22" "2022-09-29" "2022-10-06" week 7 week 8 week 9 week 10 "2022-10-13" "2022-10-20" "2022-10-27" "2022-11-03" > (xl <- as.POSIXlt(x)) week 1 week 2 week 3 week 4 "2022-09-01 UTC" "2022-09-08 UTC" "2022-09-15 UTC" "2022-09-22 UTC" week 5 week 6 week 7 week 8 "2022-09-29 UTC" "2022-10-06 UTC" "2022-10-13 UTC" "2022-10-20 UTC" week 9 week 10 "2022-10-27 UTC" "2022-11-03 UTC" > str(unclass(xl)) List of 11 $ sec : num [1:10] 0 0 0 0 0 0 0 0 0 0 $ min : int [1:10] 0 0 0 0 0 0 0 0 0 0 $ hour : int [1:10] 0 0 0 0 0 0 0 0 0 0 $ mday : int [1:10] 1 8 15 22 29 6 13 20 27 3 $ mon : int [1:10] 8 8 8 8 8 9 9 9 9 10 $ year : Named int [1:10] 122 122 122 122 122 122 122 122 122 122 ..- attr(*, "names")= chr [1:10] "week 1" "week 2" "week 3" "week 4" ... $ wday : int [1:10] 4 4 4 4 4 4 4 4 4 4 $ yday : int [1:10] 243 250 257 264 271 278 285 292 299 306 $ isdst : int [1:10] 0 0 0 0 0 0 0 0 0 0 $ zone : chr [1:10] "UTC" "UTC" "UTC" "UTC" ... $ gmtoff: int [1:10] 0 0 0 0 0 0 0 0 0 0 - attr(*, "tzone")= chr "UTC" - attr(*, "balanced")= logi TRUE > xx <- as.POSIXct(x, tz = "Europe/London") > xx week 1 week 2 week 3 "2022-09-01 01:00:00 BST" "2022-09-08 01:00:00 BST" "2022-09-15 01:00:00 BST" week 4 week 5 week 6 "2022-09-22 01:00:00 BST" "2022-09-29 01:00:00 BST" "2022-10-06 01:00:00 BST" week 7 week 8 week 9 "2022-10-13 01:00:00 BST" "2022-10-20 01:00:00 BST" "2022-10-27 01:00:00 BST" week 10 "2022-11-03 00:00:00 GMT" > as.POSIXlt(xx) week 1 week 2 week 3 "2022-09-01 01:00:00 BST" "2022-09-08 01:00:00 BST" "2022-09-15 01:00:00 BST" week 4 week 5 week 6 "2022-09-22 01:00:00 BST" "2022-09-29 01:00:00 BST" "2022-10-06 01:00:00 BST" week 7 week 8 week 9 "2022-10-13 01:00:00 BST" "2022-10-20 01:00:00 BST" "2022-10-27 01:00:00 BST" week 10 "2022-11-03 00:00:00 GMT" > as.Date(xl) week 1 week 2 week 3 week 4 week 5 week 6 "2022-09-01" "2022-09-08" "2022-09-15" "2022-09-22" "2022-09-29" "2022-10-06" week 7 week 8 week 9 week 10 "2022-10-13" "2022-10-20" "2022-10-27" "2022-11-03" > > # character vector -> R objects > y <- format(x) > as.Date(y) week 1 week 2 week 3 week 4 week 5 week 6 "2022-09-01" "2022-09-08" "2022-09-15" "2022-09-22" "2022-09-29" "2022-10-06" week 7 week 8 week 9 week 10 "2022-10-13" "2022-10-20" "2022-10-27" "2022-11-03" > as.POSIXct(y) week 1 week 2 week 3 week 4 "2022-09-01 BST" "2022-09-08 BST" "2022-09-15 BST" "2022-09-22 BST" week 5 week 6 week 7 week 8 "2022-09-29 BST" "2022-10-06 BST" "2022-10-13 BST" "2022-10-20 BST" week 9 week 10 "2022-10-27 BST" "2022-11-03 GMT" > (yy <- as.POSIXlt(y)) week 1 week 2 week 3 week 4 "2022-09-01 BST" "2022-09-08 BST" "2022-09-15 BST" "2022-09-22 BST" week 5 week 6 week 7 week 8 "2022-09-29 BST" "2022-10-06 BST" "2022-10-13 BST" "2022-10-20 BST" week 9 week 10 "2022-10-27 BST" "2022-11-03 GMT" > unclass(yy) $sec [1] 0 0 0 0 0 0 0 0 0 0 $min [1] 0 0 0 0 0 0 0 0 0 0 $hour [1] 0 0 0 0 0 0 0 0 0 0 $mday [1] 1 8 15 22 29 6 13 20 27 3 $mon [1] 8 8 8 8 8 9 9 9 9 10 $year week 1 week 2 week 3 week 4 week 5 week 6 week 7 week 8 week 9 week 10 122 122 122 122 122 122 122 122 122 122 $wday [1] 4 4 4 4 4 4 4 4 4 4 $yday [1] 243 250 257 264 271 278 285 292 299 306 $isdst [1] 1 1 1 1 1 1 1 1 1 0 $zone [1] "BST" "BST" "BST" "BST" "BST" "BST" "BST" "BST" "BST" "GMT" $gmtoff [1] NA NA NA NA NA NA NA NA NA NA attr(,"tzone") [1] "" "GMT" "BST" attr(,"balanced") [1] TRUE > > strptime(y, "%Y-%m-%d") week 1 week 2 week 3 week 4 "2022-09-01 BST" "2022-09-08 BST" "2022-09-15 BST" "2022-09-22 BST" week 5 week 6 week 7 week 8 "2022-09-29 BST" "2022-10-06 BST" "2022-10-13 BST" "2022-10-20 BST" week 9 week 10 "2022-10-27 BST" "2022-11-03 GMT" > strftime(y, "%Y-%m-%d") week 1 week 2 week 3 week 4 week 5 week 6 "2022-09-01" "2022-09-08" "2022-09-15" "2022-09-22" "2022-09-29" "2022-10-06" week 7 week 8 week 9 week 10 "2022-10-13" "2022-10-20" "2022-10-27" "2022-11-03" > y2 <- paste(y, "10:01:02"); names(y2) <- names(y) > fmt <- c("%Y-%m-%d", "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S %Z") > strptime(y2, fmt[1:2]) week 1 week 2 week 3 "2022-09-01 00:00:00 BST" "2022-09-08 10:01:02 BST" "2022-09-15 00:00:00 BST" week 4 week 5 week 6 "2022-09-22 10:01:02 BST" "2022-09-29 00:00:00 BST" "2022-10-06 10:01:02 BST" week 7 week 8 week 9 "2022-10-13 00:00:00 BST" "2022-10-20 10:01:02 BST" "2022-10-27 00:00:00 BST" week 10 "2022-11-03 10:01:02 GMT" > strptime(y2, rep(fmt[1:2], length = 15)) # failed to recycle names week 1 week 2 week 3 "2022-09-01 00:00:00 BST" "2022-09-08 10:01:02 BST" "2022-09-15 00:00:00 BST" week 4 week 5 week 6 "2022-09-22 10:01:02 BST" "2022-09-29 00:00:00 BST" "2022-10-06 10:01:02 BST" week 7 week 8 week 9 "2022-10-13 00:00:00 BST" "2022-10-20 10:01:02 BST" "2022-10-27 00:00:00 BST" week 10 week 1 week 2 "2022-11-03 10:01:02 GMT" "2022-09-01 00:00:00 BST" "2022-09-08 10:01:02 BST" week 3 week 4 week 5 "2022-09-15 00:00:00 BST" "2022-09-22 10:01:02 BST" "2022-09-29 00:00:00 BST" > > strftime(xl, fmt) week 1 week 2 week 3 "2022-09-01" "2022-09-08 00:00:00" "2022-09-15 00:00:00 UTC" week 4 week 5 week 6 "2022-09-22" "2022-09-29 00:00:00" "2022-10-06 00:00:00 UTC" week 7 week 8 week 9 "2022-10-13" "2022-10-20 00:00:00" "2022-10-27 00:00:00 UTC" week 10 "2022-11-03" > strftime(xl, rep(fmt, length = 15)) week 1 week 2 week 3 "2022-09-01" "2022-09-08 00:00:00" "2022-09-15 00:00:00 UTC" week 4 week 5 week 6 "2022-09-22" "2022-09-29 00:00:00" "2022-10-06 00:00:00 UTC" week 7 week 8 week 9 "2022-10-13" "2022-10-20 00:00:00" "2022-10-27 00:00:00 UTC" week 10 week 1 week 2 "2022-11-03" "2022-09-01 00:00:00" "2022-09-08 00:00:00 UTC" week 3 week 4 week 5 "2022-09-15" "2022-09-22 00:00:00" "2022-09-29 00:00:00 UTC" > > x2 <- xl[1:5] > x2$year <- xl$year[1:3] > x2 # correctly has missing names as NA week 1 week 2 week 3 "2022-09-01 UTC" "2022-09-08 UTC" "2022-09-15 UTC" "2022-09-22 UTC" "2022-09-29 UTC" > balancePOSIXlt(x2) # recycles names week 1 week 2 week 3 week 1 "2022-09-01 UTC" "2022-09-08 UTC" "2022-09-15 UTC" "2022-09-22 UTC" week 2 "2022-09-29 UTC" > strftime(x2, fmt) week 1 week 2 week 3 "2022-09-01" "2022-09-08 00:00:00" "2022-09-15 00:00:00 UTC" "2022-09-22" "2022-09-29 00:00:00" > strftime(x2, rep(fmt, length = 10)) week 1 week 2 week 3 "2022-09-01" "2022-09-08 00:00:00" "2022-09-15 00:00:00 UTC" week 1 "2022-09-22" "2022-09-29 00:00:00" "2022-09-01 00:00:00 UTC" week 2 week 3 "2022-09-08" "2022-09-15 00:00:00" "2022-09-22 00:00:00 UTC" "2022-09-29" >