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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top