fois POSIXct autour de l'heure d'été?
-
22-09-2019 - |
Question
Je veux soustraire 1 jour à partir d'une date de fin et Posix en même temps autour de l'heure d'été.
Par exemple, quand j'ajoute un jour:
> as.POSIXct('2009-03-08 23:00:00.000') + 86400
[1] "2009-03-09 23:00:00 EDT"
Mais quand je passe devant, il compense:
> as.POSIXct('2009-03-08 23:00:00.000') - 86400
[1] "2009-03-07 22:00:00 EST"
Quelle est la meilleure façon de traiter les différences de temps absolu autour de l'heure d'été? En général, je traite en convertissant les temps en chaînes et de traiter séparément de sorte que l'heure d'été est pas appliquée.
La solution
Votre code est en train de faire exactement ce que vous avez demandé de faire, parce que vous ne demandez pas à ajouter ou soustraire un jour, vous avez demandé à ajouter ou soustraire 24 heures . 24 heures (86400 secondes) avant 2009-03-08 23:00:00 EDT
2009-03-07 22:00:00 EST
. Je ne suis pas familier avec les bibliothèques de R, mais je suis familier avec les fonctions POSIX qu'ils enveloppent. Si vous prenez un POSIXct, diminuer sa propriété day
par 1, puis « refondue » à POSIXct
via POSIXlt
(pour faire en sorte que par exemple -1er Février devient 31 Janvier), alors vous devriez être en mesure de soustraire de manière fiable un jour.
Autres conseils
datetimes Stocker comme UTC - ou dans ce cas à convertir UTC soustraient par jour et reconvertir en heure locale. (Cela ne tient pas compte des secondes intercalaires)
Merci hobbs! Je dois faire un peu plus de travail avec elle, mais en soustrayant de la fente de jour fonctionne dans 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"
Si vous voulez juste compter les jours, vous pouvez utiliser trunc
pour se déplacer le jour juste:
> trunc(Sys.time(), "day") + 86400
[1] "2009-09-13 PDT"
> trunc(Sys.time(), "day") - 86400
[1] "2009-09-11 PDT"
Le lubridate
paquet fournit deux classes de TimeSpan supplémentaires qui précisent ce qui est un peu clair dans le package de base. De tha manuel:
Durées
Durées mesurer la quantité exacte de temps qui se produit entre deux instants. Cela peut créer des résultats inattendus par rapport aux temps d'horloge si un saut deuxième, année bissextile, ou changement de l'heure d'été (DST) se produit dans l'intervalle.
Périodes
Les périodes mesurent la variation dans le temps de l'horloge qui se produit entre deux instants. Les périodes fournissent des prévisions robustes de temps d'horloge en présence de secondes bissextiles, les années bissextiles, et les changements dans l'heure d'été.