J'ai un objet Java Date contenant des informations de date et d'heure. Je veux écrire une méthode qui coupe les informations de temps, tronque les heures-minutes-secondes, donc je n'ai plus que la date.
Exemple d'entrée:
2008-01-01 13:15:00
Production attendue:
2008-01-01 00:00:00
Avez-vous un conseil? J'ai essayé de faire quelque chose comme ça:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
mais j'ai rencontré des problèmes avec le fuseau horaire.
java.util.Calendar
maintenant héritées , supplantées par les classes java.time . Voir le didacticiel d'Oracle .Avez-vous examiné la méthode tronquée DateUtils dans Apache Commons Lang?
supprimera l'élément de temps.
la source
Avez-vous regardé Joda ? C'est une manière beaucoup plus simple et intuitive de travailler avec les dates et les heures. Par exemple, vous pouvez convertir de manière triviale entre (par exemple) des objets LocalDateTime et LocalDate .
par exemple (pour illustrer l'API)
De plus, il résout certains problèmes de sécurité des threads avec les formateurs de date / heure et est fortement recommandé pour travailler avec tous les problèmes de date / heure en Java.
la source
Juste une mise à jour rapide à la lumière des classes java.time désormais intégrées à Java 8 et versions ultérieures.
LocalDateTime
a unetruncatedTo
méthode qui répond efficacement à ce dont vous parlez ici:Cela exprimera l'heure actuelle en minutes seulement:
Vous pouvez utiliser un
ChronoUnit
(ou unTemporalUnit
) plus petit que DAYS pour exécuter la troncature (car la troncature est appliquée uniquement à la partie heure de LocalDateTime, pas à la partie date).la source
la source
Avec Joda, vous pouvez facilement obtenir la date prévue.
À partir de la version 2.7 (peut-être depuis une version antérieure supérieure à 2.2), comme le note un commentateur,
toDateMidnight
a été déconseillée en faveur ou bien nomméewithTimeAtStartOfDay()
, ce qui rend lepossible.
Avantage ajouté d'une API bien plus agréable.
Avec les anciennes versions, vous pouvez faire
la source
withTimeAtStartOfDay
.toLocalDate
pour obtenir un objet qui n'a même pas de composante temporelle.J'ai fait la troncature avec la nouvelle API java8. J'ai fait face à une chose étrange mais en général c'est tronqué ...
la source
Utilisez DateUtils d'Apache, avec truncate, comme ceci:
la source
Pour les horodatages:
la source
À partir de java.util.Date JavaDocs:
et à partir des JavaDocs java.sql.Date:
Donc, la meilleure approche est d'utiliser java.sql.Date si vous n'avez pas besoin de la partie temps
et la sortie est:
la source
tl; dr
Pour générer une chaîne au format souhaité, passez un fichier
DateTimeFormatter
.Détails
D'autres réponses sont correctes, mais utilisent d'anciennes classes de date-heure désormais dépassées par le framework java.time.
java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 ( ThreeTen-Backport ) et adaptée à Android ( ThreeTenABP ).
Modifiez d'abord la chaîne d'entrée pour qu'elle soit conforme à la version canonique du format ISO 8601. Les formats ISO 8601 standard sont utilisés par défaut dans les classes java.time pour analyser / générer des chaînes qui représentent des valeurs date-heure. Nous devons remplacer cet ESPACE au milieu par un
T
.Maintenant, nous pouvons l'analyser comme un
LocalDateTime
, où «Local» signifie aucune localité spécifique. L'entrée ne contient aucune information de décalage par rapport à UTC ou de fuseau horaire.Si vous ne vous souciez pas de l'heure ni du fuseau horaire, convertissez-le en fichier
LocalDate
.Premier moment de la journée
Si à la place vous voulez que l'heure du jour soit définie sur le premier moment de la journée, utilisez une
ZonedDateTime
classe, puis convertissez-la enLocalDate
objet pour appeler saatStartOfDay
méthode. Sachez que le premier moment peut ne pas être l'heure à00:00:00
cause de l'heure d'été ou peut-être d'autres anomalies.Le fuseau horaire est crucial car à tout moment, la date varie dans le monde par zone. Par exemple, quelques instants après minuit à Paris est un nouveau jour pour les Parisiens mais c'est toujours «hier» à Montréal pour les Canadiens.
UTC
Pour voir ce moment à travers l'objectif du fuseau horaire UTC , extrayez un
Instant
objet. Les deuxZonedDateTime
etInstant
représenteront le même moment sur la chronologie mais apparaîtront comme deux heures d'horloge murale différentes .An
Instant
est la classe élémentaire de base de java.time, toujours en UTC par définition. Utilisez cette classe fréquemment, car vous devriez généralement faire votre logique métier, votre stockage de données et votre échange de données en UTC.Nous voyons 5 heures du matin plutôt que le coup de minuit. Dans le format standard, le
Z
à la fin est l'abréviationZulu
et signifie «UTC».À propos java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
Utilisez la méthode de la classe Calendar
set()
pour définir les champsHOUR_OF_DAY, MINUTE, SECOND
etMILLISECOND
sur zéro.la source
La question est contradictoire. Il demande une date sans heure de la journée mais affiche un exemple avec une heure de
00:00:00
.Joda-Time
MISE À JOUR: Le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Voir mon autre réponse pour la solution java.time.
Si à la place vous souhaitez que l'heure du jour soit définie sur le premier moment de la journée, utilisez un
DateTime
objet de la bibliothèque Joda-Time et appelez sawithTimeAtStartOfDay
méthode. Sachez que le premier moment peut ne pas être l'heure à00:00:00
cause de l'heure d'été ou peut-être d'autres anomalies.la source
Juste
clear()
des champs redondants.À partir de Java 8, une meilleure option consiste à utiliser la
truncatedTo
méthode deLocalDateTime
, par exemple:la source
calendar.clear(Calendar.HOUR_OF_DAY);
les heures ne sont pas effacées. La solution de @cletus fonctionne bien.Cela m'a vraiment ennuyé que le nouveau constructeur de calendrier "amélioré" ne prenne pas un int pendant des millisecondes comme le "terrible" vieux Date. Je me suis alors vraiment fâché et j'ai écrit ceci:
Je n'ai pas utilisé le mot "trucs" à l'époque, mais j'ai ensuite découvert le bonheur de ceci:
Mais je suis toujours assez contrarié à ce sujet.
la source
J'ai résolu le problème comme ceci (dans la zone des huit est (heure de Beijing)):
Tout d'abord, vous devez savoir clairement ce qu'est l'horodatage. L'horodatage correspond au nombre total de millisecondes entre le 01 janvier 00:00:00 1970 et GMT (identique à UTC), ou le jeudi 01 janvier 08:00:00 CST 1970 jusqu'à maintenant.
N'oubliez pas: l'horodatage est indépendant du fuseau horaire.
Vous obtenez donc le même résultat avec l'instruction suivante dans des fuseaux horaires différents:
Et
imprime différentes informations d'heure dans différents fuseaux horaires: si vous définissez le fuseau horaire de votre ordinateur sur UTC, vous obtenez
Mais si vous définissez le fuseau horaire sur (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq, vous obtenez:
Java obtient l'horodatage, puis affiche les informations de date et d'heure en fonction du fuseau horaire.
Pour savoir comment Java affiche les informations de date et d'heure dans différents fuseaux horaires, il est facile de transcrire les informations d'heure. Vous devez obtenir l'horodatage et prendre en compte le fuseau horaire lorsque vous coupez les informations horaires. Ensuite, vous pouvez créer un nouvel objet Date avec l'horodatage coupé (nous pouvons l'appeler horodatage), java compensera le fuseau horaire lors de l'affichage des informations de date.
Comme dans la zone Est des huit (heure de Beijing), l'heure de Beijing est antérieure de 8 heures à l'heure GMT, vous devez donc soustraire plus de 8 heures lorsque vous effectuez l'opération modulo. C'est-à-dire que vous devez d'abord obtenir l'heure GMT, puis Java ajoutera 8 heures lors de l'affichage de l'heure en fonction du paramètre de fuseau horaire de votre PC.
La question du fuseau horaire est obscure et me laisse également perplexe pendant longtemps. Maintenant, je le précise. L'espoir aide.
2018-01-04 La méthode ci-dessous fonctionne également.
}
la source
Vous pouvez le faire pour éviter les problèmes de fuseau horaire:
Bien que l'
Date
objet Java soit une valeur d'horodatage, mais pendant la troncature, il sera converti en fuseau horaire local, vous obtiendrez donc une valeur surprenante si vous attendez une valeur du fuseau horaire UTC.la source
Calendar
etDate
sont devenues héritées il y a des années avec les classes java.time implémentant JSR 310 dans Java 8 et versions ultérieures. Suggérer leur utilisation en 2018 est un mauvais conseil.Peut-être une réponse tardive, mais voici un moyen de le faire en une seule ligne sans utiliser de bibliothèques:
la source
Avec Joda-Time depuis la version 2.0, vous pouvez utiliser
LocalDate.toDate()
.Simplement
la source
a Java Date object
donc j'ai utiliséjava.util.Date
. De plus, cela n'explique pas en quoi son fuseau horaire est problématique avec java.util.Date (quand? Où?) Bien qu'il ne puisse s'empêcher d'utiliser autre queDate
.Pour toutes les réponses utilisant le calendrier, vous devriez l'utiliser comme ceci à la place
Mais je préfère ceci:
la source
java.sql.Date
classe prétend représenter une valeur de date uniquement, mais a en fait une heure ajustée pour le fuseau horaire UTC. Donc pas vraiment une solution adaptée à la question.Voici un moyen simple d'obtenir une date sans heure si vous utilisez Java 8+: utilisez le type java.time.LocalDate au lieu de Date.
Le résultat:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
la source
LocalDate
est une bonne idée pour la plupart des cas, mais on ne sait pas comment cela va fonctionner avec l'entrée de la question,2008-01-01 13:15:00
.