Utilisation recommandée pour Joda-Time DateMidnight
La javdoc pour LocalDate#toDateMidnight
se lit comme suit:
Partir de v1.5, il vous est recommandé d'éviter DateMidnight et l'utilisation
toDateTimeAtStartOfDay() à la place en raison de l'exception détaillée
ci-dessous.Cette méthode lève une exception si le fuseau horaire par défaut des commutateurs
à l'Heure d'été à minuit et ce LocalDate représente
ce tournant de la date. Le problème est qu'il n'existe pas à ce qu'
minuit à la date requise, et, comme telle, une exception est levée.
Le fait que minuit n'existe pas dans certaines zones de temps semble être une raison suffisante pour éviter l'utilisation de DateMidnight
entièrement (en supposant que votre code n'est pas l'utilisation d'un fuseau horaire qui est connu pour ne pas avoir cette situation de l'heure d'été et ne sera jamais besoin de recourir à différents fuseaux horaires dans le futur).
Cependant, DateMidnight
n'est pas obsolète et il n'est pas similaire recommandation ou d'alerte dans la javadoc de la DateMidnight
classe elle-même. En outre, la DateMidnight
constructeur accepte avec plaisir un instant et le temps de la zone tels que minuit n'existe pas sur le jour, plutôt que de lancer un IllegalArgumentException
comme LocalDate#toDateMidnight
. Le résultant DateMidnight
se comporte comme un DateTime
avec le temps au début de la journée.
Quand minuit n'existe pas sur un jour donné, pourquoi ne LocalDate#toDateMidnight
lever une exception lors de la DateMidnight
constructeur n'en a pas? Qu'est-ce que le recommandé en cas d'utilisation de DateMidnight
le cas échéant?
- Notez que le “minuit” liées à des classes et des méthodes ont en effet été déprécié dans une mise à jour ultérieure de Joda-Time 2.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de bonne raison de l'utiliser
DateMidnight
.LocalDate
est la meilleure option. C'est parce que minuit ne se produit pas une fois par an dans certaines zones, complètement gâcher la facilité d'utilisation de la classe, et de créer des bugs dans les applications.Le constructeur a été corrigé afin d'éviter le pire problème, cependant, de voir un
DateMidnight
objet avec l'intérieur de l'ordre de la milliseconde valeur pointant à 01:00 n'est pas exactement une grande.new DateTime().withTimeAtStartOfDay() est recommandé.
withTimeAtStartOfDay
à la place.Ou mieux d'utiliser le
LocalDate
méthodetoDateTimeAtStartOfDay
directement à contourner la création deDateTime
objet (par rapport à la réponse ci-dessus).tl;dr
Utilisation java.le temps classes, plus précisément
LocalDate::atStartOfDay
au lieu de l'glissante idée de “minuit”.java.temps
Depuis le Joda-Time projet est maintenant en mode de maintenance, et l'équipe conseille de migration à la java.les classes de temps, je vais ajouter exemple à l'aide de java.temps.
Si vous voulez représenter toute la journée dans son ensemble, l'utilisation de la
LocalDate
classe. LeLocalDate
classe représente une date uniquement de la valeur, sans le temps de la journée et sans fuseau horaire.Un fuseau horaire est crucial dans la détermination d'une date. Pour un moment donné, la date varie à travers le monde par zone. Par exemple, quelques minutes après minuit dans Paris, France est un nouveau jour, alors encore “hier” dans Montréal, Québec.
Comme expliqué sur cette page, essayez d'identifier la fin de la journée est une mauvaise pratique. Pour une chose, vous avez le problème de l'divisible à l'infini fraction de cette dernière seconde de la journée. Ne vous résoudre à quelques millisecondes, microsecondes, la nanoseconde, ou quelque chose d'autre, que tous ceux-ci sont dans l'usage commun? Au lieu d'utiliser le premier moment de la journée.
Laisser java.le temps de déterminer l'horloge murale de ce premier moment de la journée. Ne présumez pas le temps sera
00:00:00
que les anomalies telles que l'Heure d'été (DST) peut signifier le premier moment est un temps comme le01:00:00
. De tels réglages de l'heure d'été sont actuellement en utilisation dans le temps des zones de plusieurs pays.Donc, pour un moment, un point réel sur le scénario, pour le début de la journée d'appel
LocalDate::atStartOfDay
. À noter que c'est une version plus courte du nom de la méthode que celle utilisée dans Joda-TimewithTimeAtStartOfDay
méthode. Pour spécifier les attentes de fuseau horaire dans unZoneId
pour produire unZonedDateTime
objet.À Moitié Ouverte
Donc comment représenter un laps de temps? Si je veux repérer le début et la fin de cette journée, comment dois-je faire en suivant ces conseils? La solution couramment utilisée en date du temps de travail est la Demi-approche Ouverte. Dans cette approche, le début de la durée de inclusive alors que la fin est exclusif. Donc “aujourd'hui” signifie en commençant par le premier instant de la journée et courir tout le chemin jusqu'à, mais pas y compris, le premier moment de la journée suivante.
Par le chemin, la ThreeTen-Extra projet a une pratique
Intervalle
de catégorie d'intervalles de temps.Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.Oeil à l'exception que j'ai eu dans mon code
Maintenant, je l'ai résolu en utilisant
Au lieu de
Maintenant, ma recommandation est d'utiliser des
.toDateTimeAtStartOfDay()
pour éviter ce genre d'exceptions .
N'Hésitez Pas À Modifier Ma Réponse Grâce
Ici une solution plus simple qui permettra de vérifier si la date se produit à minuit heure locale