这个问题已经讨论得太久了——尤其是考虑到问题本身与答案相关联。
这是一个输出表示问题,并且是众所周知的。舍入时间值具有影响。在某些情况下,您不能只四舍五入亚秒级值而不会得到不正确的结果。
解决方案在这里(如问题中的链接): R如何用小数秒格式化POSIXct
直接从 Aaron 的优秀答案中窃取:
myformat.POSIXct <- function(x, digits=0) {
x2 <- round(unclass(x), digits)
attributes(x2) <- attributes(x)
x <- as.POSIXlt(x2)
x$sec <- round(x$sec, digits)
format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}
x <- as.POSIXct("2012-12-14 15:42:04.577895 EDT")
你正在尝试什么:
as.POSIXlt(as.POSIXct(sprintf("%s",(format(x, "%Y-%m-%d %H:%M:%OS6")))))$sec
## [1] 4.577894
亚伦的代码:
myformat.POSIXct(x, 6)
## [1] "2012-12-14 15:42:04.577895"
有人可能会考虑使用sprintf
格式字符串%.06f
来格式化亚秒值,但如果该值略低于整数,这将失败:
sprintf('%.06f', .9999999)
## [1] "1.000000"
如果亚秒值向上舍入,则转换为 POSIXlt 会导致正确的翻转为秒、分钟等。
向您表明这不是数据问题:
y <- as.numeric(x)
y
## [1] 1355521324.5778949261
sprintf('%06f', y - floor(y))
## [1] "0.577895"