as.POSIXct 错误处理时间戳,在毫秒部分前导零

as.POSIXct is mishandling timestamp with leading zero in the milliseconds portion

as.POSIXct 似乎错误处理了时间戳,其中字符串的毫秒部分有前导 0,例如“.043”

time_043_millis <- "20210909-20:05:10.043"    #doesnt work
time_143_millis <- "20210909-20:05:10.143"    #works

转换以“.043”毫秒结尾的时间戳时,结果错误

as.POSIXct(time_043_millis, format = "%Y%m%d-%H:%M:%S.%OS")

#Returns:
#[1] "2021-09-09 20:05:43 AEST"

# its messed up, the seconds portion should be 10, and the 43 milliseconds as a fraction of a second, but its taken 43 to be seconds portion??

转换以“.143”毫秒结尾的时间戳时,结果正确。


as.POSIXct(time_143_millis, format = "%Y%m%d-%H:%M:%S.%OS")

#Returns:
#[1] "2021-09-09 20:05:10 AEST"

# This time its working correctly.. why??

我已经测试过在 windows 系统和 linux 系统上会出现同样的行为。

有什么解释吗?

这是一个错误吗?

R 来自 Linux 和 windows 系统的会话信息包含在下面的代码块中...

提前致谢。

#Windows System

> sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server 2012 R2 x64 (build 9600)

Matrix products: default

locale:
[1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252    LC_MONETARY=English_Australia.1252
[4] LC_NUMERIC=C                       LC_TIME=English_Australia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] colorspace_1.4-1 scales_1.1.1     compiler_4.0.2   R6_2.4.1         tools_4.0.2      tinytex_0.29    
 [7] xfun_0.21        lifecycle_0.2.0  munsell_0.5.0    rlang_0.4.6     


Linux system:
> sessionInfo()
R version 4.1.0 (2021-05-18)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux

Matrix products: default
BLAS/LAPACK: /usr/lib64/libopenblasp-r0.3.3.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] lubridate_1.7.10 forcats_0.5.1    stringr_1.4.0    dplyr_1.0.7      purrr_0.3.4      readr_1.4.0      tidyr_1.1.3      tibble_3.1.2     ggplot2_3.3.4    tidyverse_1.3.1 

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6        cellranger_1.1.0  pillar_1.6.1      compiler_4.1.0    dbplyr_2.1.1      tools_4.1.0       digest_0.6.27     evaluate_0.14     jsonlite_1.7.2   
[10] lifecycle_1.0.0   gtable_0.3.0      pkgconfig_2.0.3   rlang_0.4.11      reprex_2.0.0      rstudioapi_0.13   DBI_1.1.1         cli_2.5.0         yaml_2.2.1       
[19] haven_2.4.1       xfun_0.24         xml2_1.3.2        withr_2.4.2       httr_1.4.2        knitr_1.33        fs_1.5.0          generics_0.1.0    vctrs_0.3.8      
[28] hms_1.1.0         grid_4.1.0        tidyselect_1.1.1  glue_1.4.2        R6_2.5.0          fansi_0.5.0       readxl_1.3.1      rmarkdown_2.9     farver_2.1.0     
[37] modelr_0.1.8      magrittr_2.0.1    backports_1.2.1   scales_1.1.1      ellipsis_0.3.2    htmltools_0.5.1.1 rvest_1.0.0       assertthat_0.2.1  colorspace_2.0-1 
[46] labeling_0.4.2    utf8_1.2.1        stringi_1.7.3     munsell_0.5.0     broom_0.7.7       crayon_1.4.1     

您使用的格式不正确。尝试-

time_043_millis <- "20210909-20:05:10.043"    
time_143_millis <- "20210909-20:05:10.143" 

as.POSIXct(time_043_millis, format = "%Y%m%d-%H:%M:%OS", tz = 'UTC')
#[1] "2021-09-09 20:05:10 UTC"

as.POSIXct(time_143_millis, format = "%Y%m%d-%H:%M:%OS", tz = 'UTC')
#[1] "2021-09-09 20:05:10 UTC"

我们可以使用 ymd_hms

library(lubridate)
 ymd_hms(time_043_millis)
[1] "2021-09-09 20:05:10 UTC"
ymd_hms(time_143_millis)
[1] "2021-09-09 20:05:10 UTC"

数据

time_043_millis <- "20210909-20:05:10.043"    
time_143_millis <- "20210909-20:05:10.143"