如何在POSIXct中获得一天的开始

时间:2016-03-01 10:15:33

标签: r timezone posixct

我的一天从2016-03-02 00:00:00开始。不是2016-03-02 00:00:01

如何在当地时间POSIXct获得当天的开始?

我的困惑可能来自于R将此视为2016-03-01的结束日期?鉴于R使用ISO 8601?

例如,如果我尝试使用Sys.Date()找到当天的开头:

as.POSIXct(Sys.Date(), tz = "CET")
"2016-03-01 01:00:00 CET"

哪个不正确 - 但还有其他方法吗?

我知道我可以使用简单的

来解决问题
as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET")

但必须有更正确的方法来做到这一点?基础R优先。

3 个答案:

答案 0 :(得分:7)

这是一个单一命令---但你想要as.POSIXlt()

R> as.POSIXlt(Sys.Date())
[1] "2016-03-02 UTC"
R> format(as.POSIXlt(Sys.Date()), "%Y-%m-%d %H:%M:%S")
[1] "2016-03-02 00:00:00"
R> 

只有当转换为POSIXct时才会发生时区偏移到UTC(对我来说是6个小时):

R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R> 

毋庸置疑,通过包装两者,您可以获得所需的类型

R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R> 

再次提交,无需使用润滑剂或其他非Base R包装。

答案 1 :(得分:1)

尽管您可以理解地更喜欢基础R,但对于“智能”的某些含义,“智能方式”将是:

library(lubridate)
x <- floor_date(Sys.Date(),"day")

> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"

来自?floor_date

  

floor_date采用日期时间对象并将其向下舍入到最近的对象   指定时间单位的整数值。

非常方便。

答案 2 :(得分:0)

你的例子有点不清楚。

您说的是一天开始的1分钟差异,但您的示例显示由于时区而产生的1小时差异。

你可以尝试

?POSIXct  

获得解释的功能。

使用带有POSIXct的Sys.Date()会以某种方式覆盖您的时区设置。

as.POSIXct(Sys.Date(), tz="EET")  
 "2016-03-01 01:00:00 CET"  

输入字符串时会给你

as.POSIXct("2016-03-01 00:00:00", tz="EET")  
 "2016-03-01 EET"

看起来00:00:00实际上是一天的开始。您可以从以下2个不等式

的结果中得出结论
as.POSIXct("2016-03-02 00:00:02 CET")>as.POSIXct("2016-03-02 00:00:01 CET")

TRUE

as.POSIXct("2016-03-02 00:00:01 CET")>as.POSIXct("2016-03-02 00:00:00 CET")

TRUE

所以这是一个时区问题。请注意,00:00:00会自动从as.POSIXct结果中删除。

as.POSIXct("2016-03-02 00:00:00 CET")

“2016-03-02 CET”