2017-06-12 10 views
1

J'utilise le code suivant pour déterminer si l'heure d'été est utilisée en Europe centrale au jour indiqué par les variables année, mois et jour.Debian ne tient pas compte de l'heure d'été dans R

timeString = paste(toString(year), formatC(month, width = 2, flag="0"), formatC(day, width = 2, flag="0"), "12", sep = "-") 
time = strptime(timeString, format = "%Y-%m-%d-%H") 
diff = as.numeric(as.POSIXct(time, tz="UTC") - as.POSIXct(time, tz="Europe/Prague")) 

Sur mon PC (Ubuntu 16.04), diff est 2 lorsque heure d'été est actif, 1 othervise, mais sur le serveur avec Debian 8.8, il est 1 dans tous les cas. Savez-vous comment configurer le serveur pour qu'il se comporte comme Ubuntu? Merci. Mise à jour: La modification des paramètres d'heure Debian changerait également le temps utilisé pour crontab, ce qui n'est pas souhaitable. La réinstallation de R avec une nouvelle configuration semblait risquée, car quelques scripts R fonctionnaient toutes les quelques minutes. J'ai donc choisi la solution « laid » sous forme de la fonction R:

DaylightSaving = function(year, month, day) { 
     # years 2010-2030 
     if (year < 2010 || year > 2030) { 
     stop("The function is implemented now only for years 2010-2030") 
     } 
     dayStart = c(28, 27, 25, 31, 30, 29, 27, 26, 25, 31, 29, 28, 27, 26, 
    31, 30, 29, 28, 26, 25, 31) 
     dayEnd = c(31, 30, 28, 27, 26, 25, 30, 29, 28, 27, 25, 31, 30, 29, 
    27, 26, 25, 31, 29, 28, 27) 
     if (month < 3 || month > 10) { 
     return(FALSE) 
     } else if (month == 3 && day < dayStart[year - 2009]) { 
     return(FALSE) 
     } else if (month == 10 && day >= dayEnd[year - 2009]) { 
     return(FALSE) 
     } 
     return(TRUE) 
    } 
+1

Avez-vous pris le temps de vérifier si les deux systèmes ont le même paramètre de fuseau horaire? –

Répondre

0

Tout d'abord, si vous voulez vérifier si l'économie de la lumière du jour est en cours d'utilisation, vous pouvez simplement faire:

#Make a test date 
atime <- as.POSIXct("2017-05-23 13:25", 
        tz = "Europe/Prague") 
#test for DST 
as.POSIXlt(atime)$isdst > 0 

Le POSIXlt class est en interne une liste avec un élément isdst soit 0 si l'heure d'été n'est pas active, positive quand elle l'est, et négative si cette information n'est pas disponible. (Voir ?DateTimeClasses).

Je voudrais également souligner les points suivants à partir des pages d'aide sur les fuseaux horaires:

Notez que sauf remplacé, le fonctionnement des fuseaux horaires est un service OS , et même où a remplacé un troisième La base de données de parties est utilisée et peut être mise à jour (voir la section sur les 'Noms de fuseaux horaires'). Les résultats incorrects ne seront jamais un problème R, alors assurez-vous que vous avez le avec la permission de ne pas blâmer R pour eux.

Le problème n'est pas R, mais votre installation Debian ne tient pas compte de l'heure d'été. Vous pouvez résoudre ce problème en configurant R avec l'option --with-internal-tzcode, de sorte qu'il utilise sa propre base de données timezone. Mais ce n'est généralement pas nécessaire si le système de fuseau horaire de votre Debian est correctement configuré. Plus d'informations sur la façon de configurer R peut être trouvé sur la page d'aide ?timezones et dans le Installation and Administration manual - appendix B. La meilleure façon de résoudre ce problème est de s'assurer que votre installation Debian traite correctement l'heure d'été. Vous pouvez commencer par vérifier si vous avez une version correcte du tzdata package.

Il y a une question similaire sur unix.stackexchange.com:

https://unix.stackexchange.com/questions/274878/system-disregards-daylight-saving-time

+0

Merci Joris, c'est du boulot pour l'administrateur système du serveur Debian, il a beaucoup de travail maintenant, il a promis de le résoudre en septembre avant l'heure d'été. – Lukas