J'ai un problème pour réinitialiser les heures en Java. Pour une date donnée, je souhaite régler les heures sur 00:00:00.
Voici mon code:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
Le problème est que parfois l'heure est 12:00:00
et parfois elle l'est 00:00:00
et lorsque j'interroge la base de données pour une entité qui a été enregistrée 07.02.2013 00:00:00
et l'heure réelle de l'entité, qui est stockée, 12:00:00
la requête échoue.
Je le sais 12:00:00 == 00:00:00
!
J'utilise AppEngine. S'agit-il d'un bogue, d'un problème ou d'un autre problème avec Appengine? Ou cela dépend-il d'autre chose?
java
java.util.calendar
Adelin
la source
la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
, pour mon but, ça marche bien.Réponses:
Utilisez une autre constante au lieu de
Calendar.HOUR
, utilisezCalendar.HOUR_OF_DAY
.Calendar.HOUR
utilise 0-11 (pour une utilisation avec AM / PM) etCalendar.HOUR_OF_DAY
utilise 0-23.Pour citer les Javadocs:
et
Test ("maintenant" est actuellement d'environ 14 h 55 le 23 juillet 2013, heure avancée du Pacifique):
Production:
la source
Calendar.HOUR
ne définirait pas PM sur AM, le laissant à midi.java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'Oracle .java.time
Utilisation du
java.time
framework intégré à Java 8 et versions ultérieures. Voir le didacticiel .Si vous n'avez pas besoin de temps de la journée (heure, minute, seconde, etc.), envisagez d'utiliser la
LocalDate
classe.la source
LocalDateTime
est exactement la mauvaise classe à utiliser pour cela. Il ne peut pas représenter un moment car il ne dispose d'aucun concept de fuseau horaire ou de décalage par rapport à UTC. AppelerLocalDateTime.now
n'a presque jamais de sens. UtilisezZonedDateTime
plutôt. Sinon, vous ignorez les problèmes cruciaux de fuseau horaire. D'une part, certaines dates dans certaines zones ne commencent pas à 00h00!Voici quelques fonctions utilitaires que j'utilise pour faire exactement cela.
la source
Une autre façon JAVA 8:
Mais il est beaucoup plus utile de modifier la date qui existe déjà.
la source
LocalDateTime
ne peut pas représenter un moment, car il ne dispose d'aucun concept de fuseau horaire ou de décalage par rapport à UTC. AppelerLocalDateTime.now
n'a presque jamais de sens. Vous devriez utiliser à laZonedDateTime
place.Vous feriez mieux de définir principalement le fuseau horaire sur le composant DateFormat comme ceci:
Ensuite, vous pouvez obtenir l'heure "00:00:00" en passant 0 millisecondes au formateur:
ou vous pouvez créer un objet Date:
ou vous pouvez avoir plus de possibilités en utilisant le composant Calendrier, mais vous devez également définir le fuseau horaire comme GMT pour l'instance de calendrier:
la source
tl; dr
java.time
Vous utilisez de terribles vieilles classes date-heure qui ont été supplantées il y a des années par les classes java.time modernes définies dans JSR 310.
Date
➙Instant
A
java.util.Date
représente un moment UTC. Son remplacement estInstant
. Appelez les nouvelles méthodes de conversion ajoutées aux anciennes classes.Fuseau horaire
Spécifiez le fuseau horaire dans lequel vous souhaitez que votre nouvelle heure ait du sens.
Indiquez un nom de fuseau horaire approprié dans le format
Continent/Region
, tels queAmerica/Montreal
,Africa/Casablanca
ouPacific/Auckland
. N'utilisez jamais l'abréviation de 2 à 4 lettres commeEST
ouIST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!)ZonedDateTime
Appliquez le
ZoneId
pourInstant
obtenir unZonedDateTime
. Même moment, même point sur la chronologie, mais heure d'horloge murale différente.Changement d'heure
Vous avez demandé à changer l'heure de la journée. Appliquer a
LocalTime
pour changer toutes les parties de l'heure: heure, minute, seconde, fraction de seconde. Un nouveauZonedDateTime
est instancié, avec des valeurs basées sur l'original. Les classes java.time utilisent ce modèle d' objets immuables pour assurer la sécurité des threads .Premier moment de la journée
Mais vous avez demandé spécifiquement 00h00. Donc, apparemment, vous voulez le premier moment de la journée. Attention: certains jours dans certaines zones ne commencent pas à 00h00. Ils peuvent démarrer à une autre heure telle que 01:00:00 en raison d'anomalies telles que l'heure d'été (DST).
Laissez java.time déterminer le premier moment. Extrayez la partie datée uniquement. Passez ensuite le fuseau horaire pour obtenir le premier moment.
Ajuster à UTC
Si vous devez revenir à UTC, extrayez un fichier
Instant
.Instant
➙Date
Si vous avez besoin d'un
java.util.Date
pour interagir avec l'ancien code pas encore mis à jour vers java.time , convertissez.la source
Faire cela pourrait être plus facile (dans Java 8)
la source
Nous pouvons définir la partie d'heure java.util.Date sur 00:00:00 en utilisant la classe LocalDate de l' API Java 8 / Joda-datetime :
la source
Si vous avez besoin du format 00:00:00 dans une chaîne, vous devez utiliser SimpleDateFormat comme ci-dessous. Utiliser "H" au lieu de "h".
la source
Une autre façon de faire cela serait d'utiliser un DateFormat sans aucune seconde:
la source
Vous pouvez faire cela avec les éléments suivants:
la source
Comme Java8 ajoute de nouvelles fonctions de date, nous pouvons le faire facilement.
la source
LocalDateTime
ne peut pas représenter un moment, car il ne dispose d'aucun concept de fuseau horaire ou de décalage par rapport à UTC. AppelerLocalDateTime.now
n'a presque jamais de sens. Vous devriez utiliser à laZonedDateTime
place.