Posixct vezes em torno do horário de verão?
-
22-09-2019 - |
Pergunta
Quero subtrair 1 dia de uma data de Posix e acabar ao mesmo tempo em torno do horário de verão.
Por exemplo, quando eu adiciono um dia:
> as.POSIXct('2009-03-08 23:00:00.000') + 86400
[1] "2009-03-09 23:00:00 EDT"
Mas quando vou passar, isso compensa:
> as.POSIXct('2009-03-08 23:00:00.000') - 86400
[1] "2009-03-07 22:00:00 EST"
Qual é a melhor maneira de lidar com diferenças de tempo absolutas em torno do horário de verão? Normalmente, lido com isso convertendo os tempos em cordas e lidando com eles separadamente para que o DST não seja aplicado.
Solução
Seu código está fazendo exatamente o que você pediu para fazer, porque você não pediu para adicionar ou subtrair um dia, você pediu para adicionar ou subtrair 24 horas. 24 horas (86400 segundos) antes 2009-03-08 23:00:00 EDT
é 2009-03-07 22:00:00 EST
. Não estou familiarizado com as bibliotecas R, mas estou familiarizado com as funções POSIX que elas envolvem. Se você tomar um posixct, diminua seu day
propriedade por 1 e depois "re-casti POSIXct
através da POSIXlt
(Para garantir que, por exemplo, de fevereiro -1st se torne 31 de janeiro), você poderá subtrair um dia de maneira confiável.
Outras dicas
Armazene as vezes como UTC - ou, neste caso, convertem para subtrair o UTC por dia e converter de volta à hora local. (Isso ignora segundos saltos)
Obrigado Hobbs! Eu preciso fazer um pouco mais de trabalho com ele, mas subtrair do slot do dia funciona em Posixlt:
> a <- as.POSIXct('2009-03-08 23:00:00.000')
> as.POSIXlt(a)
[1] "2009-03-08 23:00:00 EDT"
> a <- as.POSIXlt(a)
> a$mday <- a$mday -1
> a
[1] "2009-03-07 23:00:00 EDT"
Se você quer apenas contar os dias, pode usar trunc
Para apenas mudar o dia:
> trunc(Sys.time(), "day") + 86400
[1] "2009-09-13 PDT"
> trunc(Sys.time(), "day") - 86400
[1] "2009-09-11 PDT"
O pacote lubridate
Fornece duas classes de tempo adicionais que especificam o que não é claro no pacote base. Do manual tha:
Durações
As durações medem a quantidade exata de tempo que ocorre entre dois instantes. Isso pode criar resultados inesperados em relação aos tempos de relógio, se ocorrer um salto em segundo, ano salto ou alteração no horário de verão (DST) no intervalo.
Períodos
Os períodos medem a alteração no tempo de relógio que ocorre entre dois instantes. Os períodos fornecem previsões robustas do tempo de relógio na presença de segundos saltos, anos bissextos e alterações no DST.