Un non-déconseillé équivalent exact de la Date(String s) en Java?
J'ai des vieux code qui utilise new Date(dateString)
pour analyser une chaîne de date. En compilant le code produit de la dépréciation d'avertissement Date(java.lang.String) in java.util.Date has been deprecated
.
La javadoc unhelpfully me conseille d'utiliser DateFormat.parse()
, même si le DateFormat
, la classe n'est statique parse
méthode.
Maintenant, je sais comment utiliser SimpleDateFormat
, mais je veux m'assurer que je me fais de la exactement le même comportement de la deperecated Date
constructeur.
Vous devez vous connecter pour publier un commentaire.
Voici ma conjecture (j'ai posté comme le wiki de la communauté de sorte que vous pouvez voter si je suis à droite):
SimpleDateFormat est le chemin à parcourir. Puis-je souligner, cependant, que vous pouvez vous sentir obligé de définir un SimpleDateFormat instance et la Date de compilation des objets à l'aide de ce. Si vous le faites, attention, SimpleDateFormat n'est pas thread-safe et vous pourriez vous exposer à certains potentiellement difficiles à déboguer les problèmes!
Je vous recommande cette occasion pour regarder Joda qui est beaucoup mieux pensé (et thread-safe) de l'API. Il constitue la base de la JSR-310, qui est le nouveau projet Java Date de l'API.
Je comprends que c'est un peu plus de travail. Cependant, il est probablement utile étant donné que vous êtes d'avoir à refactoriser le code pour le moment.
Si vous jetez un oeil à la source de la Date.parse(String s) méthode que Nicolas mentionne, vous verrez qu'il sera difficile, voire impossible, de construire un format de date qui exactement reproduit le comportement.
Si vous voulez juste pour éliminer l'avertissement, vous pourriez mettre
@SuppressWarnings({“deprecation”})
en dehors de la méthode de l'appel de la Date(String) constructeur.Si vous voulez vraiment vous assurer à l'avenir l'accès à ce comportement à l'avenir Jre, vous pourriez être en mesure de simplement extrait de la méthode à partir du JDK sources et de mettre dans vos propres sources. Cela nécessiterait une attention lire le code source des licences et de leur application à votre projet, et pourrait ne pas être admissible à tous.
DateFormat a des méthodes statiques qui retour DateFormat instances. Je ne sais pas lequel (le cas échéant) a le même comportement que
Date(String s)
mais ici, vous allez:Réponse courte (avant l'enquête) est: non, il n'est pas équivalent. la Date(String toParse) constructeur est équivalente à la méthode d'analyse de la classe Date (ce qui est également déconseillé)... Et le javadoc de cette méthode revendications:
Si c'est le seul changement, je suppose que vous pouvez aller sur cette voie.
tl;dr
java.temps
Le terrible
Date
etDateFormat
classes ont été supplantés ans par le moderne java.temps classes avec l'adoption de JSR 310.La constructeur vous référence est en fait les appels à la méthode statique
Date.parse
. En tant que documentation explique, cette méthode prend une variété de formats. Il n'y a point unique pour le même comportement dans les java.temps. Cependant, j'en doute, votre application se heurte à de tous ces divers format syntaxes simultanément.Je vous suggère de regarder les formats utilisés par vos données réelles. Puis concevoir une collection de
DateTimeFormatter
objets de match. Noter que, contrairement à l'héritage de classes, la java.temps classes sont entièrement thread-safe. De sorte que vous pouvez garder un ensemble de formateurs autour pour utiliser à plusieurs reprises tout au long de votre application et dans les threads.Pour la mise en forme du motif indiqué dans la accepté de Répondre, ici, c'est l'équivalent en java.temps à l'aide de la
DateTimeFormatter
classe. Notez que vous devez explicitement état de votre choix/prévu locale plutôt que de s'appuyer implicitement sur la JVM actuel de paramètres régionaux par défaut.Vous devriez éviter d'utiliser l'héritage de date-heure classes telles que
java.util.Date
dans la mesure du possible. Mais si vous devez avoir unDate
pour interagir avec l'ancien code pas encore mis à jour à java.temps, vous pouvez convertir des. Regarder vers de nouvelles conversions les méthodes ajoutées aux anciennes classes.La mal nommée
java.util.Date
représente un moment dans le temps UTC. Son équivalent moderneest le
java.temps.Instantané
classe. Nous pouvons en extraire uneInstant
de notreZonedDateTime
. Puis convertir unDate
.Aller dans une autre direction.
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
.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.
La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
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.Pour analyser une date de chaîne d'heure en format ISO, vous devez utiliser le DateFormat comme ceci:
java.text.DateFormat.getDateInstance().parse(dt);
Avec SimpleDateFormat vous avez besoin de connaître le format.