lubridate: завтра в определенное время c? - PullRequest
0 голосов
/ 07 января 2020

Мне нужно создать объект POSIXt, представляющий завтра в 6:00 (местное время). Лучшее выражение lubridate, которое я придумал, это:

lubridate::floor_date(lubridate::now() + lubridate::days(1), "day") + lubridate::hours(6))

Это выглядит немного неуклюжим («сейчас + 1 день -> усечение до ближайшего дня -> + 6 часов»). Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Вы могли бы сделать

Sys.Date() + 1 + lubridate::hours(6)
#[1] "2020-01-08 06:00:00 UTC"
1 голос
/ 07 января 2020

Это работает для меня в моем часовом поясе (CET):

library(lubridate)
ceiling_date(now(), "day") + hours(6)
floor_date(now(), "day") + hours(30)

Оба возвращают

[1] "2020-01-08 06:00:00 CET"

РЕДАКТИРОВАТЬ : Это также работает:

library(lubridate)
`tz<-`(today() + hours(30), "")
`tz<-`(Sys.Date() + hours(30), "")

Оба возвращаются (в моем местном часовом поясе)

[1] "2020-01-08 06:00:00 CET"

(Объяснение ниже)

Приложение

Интересно, что ответ Ронака Шаха с использованием Sys.Date(), а также предложение Брайана использовать lubridate::today() для переключения часового пояса на UT C:

Sys.Date() + 1 + lubridate::hours(6)
[1] "2020-01-08 06:00:00 UTC"
library(lubridate)
today() + hours(30)
[1] "2020-01-08 06:00:00 UTC"

, что не в соответствии с требованием OP по местному времени .

По-видимому, это происходит при принудительном приведении класса Date к POSIXct:

lubridate::hours() возвращает объект Period. При добавлении объекта Period к объекту Date кажется, что lubridate::as_datetime() используется для приведения. as_datetime() использует "UTC" в качестве часового пояса по умолчанию. Часовой пояс может быть установлен впоследствии, например,

`tz<-`(today() + hours(30), "")
...