我在时间转换中遗漏了什么吗?非常简单的例子:
library(lubridate)
time <- "2019-01-14 10:58:23.438000"
op <- options(digits.secs=6)
ymd_hms(time, tz = "Europe/Helsinki")
[1] "2019-01-14 10:58:23.437 EET"
ymd_hms(time)
[1] "2019-01-14 10:58:23.437 UTC"
Run Code Online (Sandbox Code Playgroud)
为什么这里的毫秒数是一秒?似乎不是四舍五入的问题?
虽然这似乎有效:
time <- "2019-01-14 10:58:23.123456"
op <- options(digits.secs=6)
ymd_hms(time)
[1] "2019-01-14 10:58:23.123456 UTC"
Run Code Online (Sandbox Code Playgroud)
会话信息
sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=Finnish_Finland.1252 LC_CTYPE=Finnish_Finland.1252 LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C
[5] LC_TIME=Finnish_Finland.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] lubridate_1.7.4
loaded via a namespace (and not attached):
[1] compiler_3.5.1 magrittr_1.5 tools_3.5.1 yaml_2.2.0 Rcpp_1.0.0 stringi_1.2.4 stringr_1.3.1
Run Code Online (Sandbox Code Playgroud)
编辑:这个答案POSIXct 类中的毫秒解决了正在发生的事情POSIXct
(请注意,您会遇到舍入错误,并且 R 的日期时间格式总是向下舍入,因此如果您显示的小数位数较少,有时看起来您丢失了一毫秒。)
问题似乎也存在于ymd_hms和as.POSIXct。
如果我strptime直接调用或使用as.POSIXlt,毫秒解析正确:
strptime(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki")
as.POSIXlt(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki")
Run Code Online (Sandbox Code Playgroud)
这些选项中的任何一个都可以解决您的问题。
"2019-01-14 10:58:23.438 EET"
Run Code Online (Sandbox Code Playgroud)
POSIXltPOSIXct然而,行为有所不同:
as.POSIXlt(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki") %>%
format(., "%Y-%m-%d %H:%M:%OS6")
[1] "2019-01-14 10:58:23.438000"
as.POSIXct(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki") %>%
format(., "%Y-%m-%d %H:%M:%OS6")
[1] "2019-01-14 10:58:23.437999"
Run Code Online (Sandbox Code Playgroud)