Joda-Time, l'Heure d'été changement de date et de temps d'analyse
J'ai le problème suivant à l'aide de Joda-Time de l'analyse et de la production de la date et de l'heure de autour de L'Heure D'Été (DST) heures. Voici un exemple (s'il vous plaît, notez que le 30 Mars 2008 est l'heure d'été à modifier en Italie):
DateTimeFormatter dtf = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime x = dtf.parseDateTime("30/03/2008 03:00:00");
int h = x.getHourOfDay();
System.out.println(h);
System.out.println(x.toString("dd/MM/yyyy HH:mm:ss"));
DateTime y = x.toDateMidnight().toDateTime().plusHours(h);
System.out.println(y.getHourOfDay());
System.out.println(y.toString("dd/MM/yyyy HH:mm:ss"));
J'obtiens le résultat suivant:
3
30/03/2008 03:00:00
4
30/03/2008 04:00:00
Quand je lis l'heure-je obtenir de l'heure est de 3. Dans ma structure de données I sauver la journée stockage de minuit de temps, puis je avoir une certaine valeur pour chaque heure de la journée (de 0 à 23). Puis, quand j'ai écrit la date, j'ai re-calculer la date de temps à faire de minuit plus l'heure. Quand j'somme de 3 heures pour mon minuit je reçois 04:00:00! Et si je l'analyser à nouveau, je reçois 4 heures!
Où est mon erreur? Est-il un moyen pour obtenir l'heure 2 quand je lis ou obtenir de l'heure trois quand j'imprime?
J'ai aussi essayé à la sortie de la construction à la main:
String.format("%s %02d:00:00", date.toString("dd/MM/yyyy"), h);
mais dans ce cas, pour l'heure 2, je produis 30/03/2008 02:00:00 qui n'est pas une date valide (depuis l'heure 2 n'existe pas) et ne peut être analysée plus.
Je vous remercie d'avance pour votre aide.
Filippo
OriginalL'auteur Filippo Tabusso | 2010-10-23
Vous devez vous connecter pour publier un commentaire.
La structure de données que vous enregistrez vos données n'est pas très optimal pour les jours à l'heure d'été. Votre journée en ce jour particulier, ne devrait avoir que 23 heures.
Si vous n':
Vous obtenez le résultat attendu, que le temps est à 05:00.
Je vous recommande de changer la façon dont vous stockez votre journée et de les utiliser un jour. Si non, vous devez gérer l'heure d'été lors du stockage de l'heure de la journée.
Vous pourriez faire quelque chose comme ceci:
Dans le cas où nous passons le temps en avant une heure, comme ce cas, vous devez stocker 4 et pas 5 comme le temps 5. Et lorsque vous calculez le temps, vous devez utiliser le plusHours() la méthode pour obtenir le temps réel. Je pense que vous pourriez sortir avec quelque chose comme:
...ou fondamentalement quelque chose comme ça. Je ferais un test pour cela, si vous choisissez de descendre cette route. Vous pouvez modifier la HOUR_TO_TEST de voir que ça bouge passé à l'heure d'été.
Si vous avez une chaîne je suppose que vous pouvez utiliser le hourOfDay que celui-là, non? Les gens qui fournissent la chaîne offrir dans quelques temps, la zone de droite? Si le fuseau horaire est également affectée par l'heure d'été, alors il ne devrait pas être un problème, étant donné que le producteur et le consommateur est dans le même fuseau horaire (alors illégal date 02:00 ne sera jamais envoyé). Si vous obtenez la date dans un autre fuseau horaire, par exemple UTC, puis le parseDateTime méthode dispose de fonctionnalités pour l'analyse d'autres fuseaux horaires de vos paramètres régionaux en cours - rechercher de la documentation.
OriginalL'auteur
Vous avez déjà mentionné que cette date est exactement lors du changement d'heure. Donc, il n'y a pas d'erreur. Le 30 mars 2010 00:00 CEST (le fuseau horaire en Italie) est parlant précisément Mars 29, 2010 23:00 UTC. Lorsque vous ajoutez 3 heures, vous obtiendrez le 30 Mars 2010, 02:00 UTC. Mais ce post est le moment que nous allons passer des moments (ce qui arrive à 01:00 UTC), de sorte que lorsque vous convertissez l'heure locale du fuseau horaire, vous obtenez 30 Mars, 04:00. C'est le comportement correct.
Non, parce que le 30 Mars 2010, 02:00 CEST n'existe pas. Précisément au 30 Mars 2010, 01:00 UTC, nous changer de temps à partir de +1 heure +2 heures par rapport à l'heure UTC, donc le 30 Mars 2010, 00:59 UTC 30 Mars 2010, 01:59, mais le 30 Mars 2010, 01:00 UTC devenir le 30 Mars 2010, 03:00 CEST. N ° 02:xx heure existent sur cette date particulière.
BTW. Dans une semaine, vous pouvez vous attendre à un autre "fun". Pouvez-vous dire à quelle date au format UTC cela fait référence à:
31 octobre 2010 à 02:15 CEST ?
Bien, ce qui est marrant, nous ne sais pas. Il pourrait être soit 0ctobre 31, 2010 00:15 UTC (avant les temps de commutation) ou le 31 octobre 2010 01:15 UTC (après le changement).
C'est exactement pourquoi vous devriez toujours mettre la date et l'heure par rapport à l'UTC et de les convertir à l'heure locale de la zone avant de les afficher, sinon vous risquez une ambiguïté.
HTH.
OriginalL'auteur Paweł Dyda
Appuyant sur les réponses correctes par Paweł Dyda & Knubo...
ISO 8601 Pour le Format de la Chaîne de
Vous devriez ne jamais stocker (sérialiser) une date-heure comme une chaîne de caractères dans le format que vous avez mentionné:
"30/03/2008 03:00:00"
. Problèmes:Si vous devez sérialiser une date de valeur au texte, utilisez un bon format. Le choix évident est la ISO 8601 format standard. Encore mieux, c'est la conversion de l'heure locale de UTC (Zulu) fuseau horaire, puis aux format ISO 8601. Comme ceci:
2013-11-01T04:48:53.044Z
Pas De Minuit
La
midnight
méthodes de Joda-Time est déprécié en faveur de la Joda-Time méthodewithTimeAtStartOfDay()
(voir doc). Certains jours ne ne pas avoir de minuit.Exemple de Code dans Joda-Time 2.3
Quelques commentaires à propos de ce code source:
Exemple montrant à 23 heures dans la journée, de l'heure d'été (Daylight Saving Time) à Rome en Italie, alors que le jour d'après a 24 heures. Notez que le fuseau horaire (pour Rome) est spécifié.
Exemple de stocker une date-heure en première traduction de l'heure UTC. Ensuite, lors de la restauration de la date d'objet en temps, ajuster le fuseau horaire désiré.
Lors de l'exécution à:
OriginalL'auteur Basil Bourque