Quelle est la meilleure façon de convertir un String
au format «2 janvier 2010» en un Date
en Java?
En fin de compte, je veux décomposer le mois, le jour et l'année sous forme d'entiers afin de pouvoir utiliser
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
pour convertir la date en heure.
Date
sont dépréciés.java.util.Date
,java.util.Calendar
etjava.text.SimpleTextFormat
sont maintenant héritage , supplanté par les java.time classes. Voir Tutoriel par Oracle .Réponses:
C'est la voie difficile, et ces
java.util.Date
méthodes de définition sont obsolètes depuis Java 1.1 (1997). Formatez simplement la date enSimpleDateFormat
utilisant un modèle de format correspondant à la chaîne d'entrée .Dans votre cas spécifique de "2 janvier 2010" comme chaîne d'entrée:
MMMM
modèle pour celad
modèle pour cela.yyyy
modèle pour cela.Notez l'importance de l'
Locale
argument explicite . Si vous l'omettez, il utilisera les paramètres régionaux par défaut qui ne sont pas nécessairement l'anglais comme utilisé dans le nom du mois de la chaîne d'entrée. Si les paramètres régionaux ne correspondent pas à la chaîne d'entrée, vous obtiendrez alors une confusion,java.text.ParseException
même si le modèle de format semble valide.Voici un extrait de la pertinence du javadoc , répertoriant tous les modèles de format disponibles:
Notez que les modèles sont sensibles à la casse et que les modèles basés sur du texte de quatre caractères ou plus représentent la forme complète; sinon, un formulaire court ou abrégé est utilisé s'il est disponible. Donc, par exemple,
MMMMM
ou plus n'est pas nécessaire.Voici quelques exemples de
SimpleDateFormat
modèles valides pour analyser une chaîne donnée à ce jour:Une note importante est que ce
SimpleDateFormat
n'est pas sûr pour les threads. En d'autres termes, vous ne devez jamais le déclarer et l'assigner en tant que variable statique ou d'instance, puis le réutiliser à partir de différentes méthodes / threads. Vous devez toujours le créer tout nouveau dans le cadre local de la méthode.Mise à jour Java 8
Si vous êtes sur Java 8 ou une version plus récente, utilisez
DateTimeFormatter
(également ici, cliquez sur le lien pour voir tous les formateurs prédéfinis et les modèles de format disponibles; le tutoriel est disponible ici ). Cette nouvelle API est inspirée de JodaTime .Remarque: si votre modèle de format contient également la partie temps, utilisez-le à la
LocalDateTime#parse(text, formatter)
place deLocalDate#parse(text, formatter)
. Et, si votre modèle de format contient également le fuseau horaire, utilisez-le à laZonedDateTime#parse(text, formatter)
place.Voici un extrait de la pertinence du javadoc , répertoriant tous les modèles de format disponibles:
Notez qu'il a plusieurs formateurs prédéfinis pour les modèles les plus populaires. Donc, au lieu de, par exemple
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, vous pouvez utiliserDateTimeFormatter.RFC_1123_DATE_TIME
. Cela est possible car ils sont, au contraireSimpleDateFormat
, thread-safe. Vous pouvez donc également définir le vôtre, si nécessaire.Pour un format de chaîne d'entrée particulier, vous n'avez pas besoin d'utiliser une explicite
DateTimeFormatter
: une date ISO 8601 standard , comme 2016-09-26T17: 44: 57Z, peut être analysée directementLocalDateTime#parse(text)
car elle utilise déjà leISO_LOCAL_DATE_TIME
formateur. De même,LocalDate#parse(text)
analyse une date ISO sans le composant temps (voirISO_LOCAL_DATE
) etZonedDateTime#parse(text)
analyse une date ISO avec un décalage et un fuseau horaire ajoutés (voirISO_ZONED_DATE_TIME
).la source
O
, comment le laisser imprimerUTC+08:00
au lieu deGMT+08:00
. Je n'ai pu obtenir aucun exemple.20-JUN-16 12.00.00.000000000 AM
besoin d'aide pour la convertir en date. Votre aide est très appréciée!!Ah oui, la discussion Java Date, encore une fois. Pour gérer la manipulation des dates , nous utilisons Date , Calendar , GregorianCalendar et SimpleDateFormat . Par exemple, en utilisant votre date de janvier comme entrée:
Ensuite, vous pouvez manipuler cela avec quelque chose comme:
la source
la source
Avec Java 8, nous obtenons une nouvelle API de date / heure ( JSR 310 ).
La méthode suivante peut être utilisée pour analyser la date dans Java 8 sans compter sur Joda-Time :
LocalDate est la classe Java 8 standard pour représenter une date (sans heure). Si vous souhaitez analyser des valeurs contenant des informations de date et d'heure, vous devez utiliser LocalDateTime . Pour les valeurs avec des fuseaux horaires, utilisez ZonedDateTime . Les deux fournissent une
parse()
méthode similaire àLocalDate
:La liste des caractères de mise en forme de Javadoc DateTimeFormatter :
la source
Bien que certaines des réponses soient techniquement correctes, elles ne sont pas recommandées.
Cette bibliothèque gratuite open-source populaire peut être utilisée sur plusieurs versions de Java. De nombreux exemples de son utilisation peuvent être trouvés sur StackOverflow. La lecture de certains de ces documents vous aidera à vous mettre rapidement au courant.
Ce nouvel ensemble de classes est inspiré de Joda-Time et défini par JSR 310. Ces classes sont intégrées à Java 8. Un projet est en cours pour rétroporter ces classes vers Java 7, mais ce rétroportage n'est pas soutenu par Oracle.
comprend une partie date et une partie heure)
Le début d'une journée dépend du fuseau horaire. Si vous ne spécifiez pas de fuseau horaire, le fuseau horaire par défaut de la JVM est appliqué. Cela signifie que le comportement de votre code peut changer lorsqu'il est exécuté sur d'autres ordinateurs ou avec un paramètre de fuseau horaire modifié. Probablement pas ce que vous voulez.
régionaux Le langage des paramètres régionaux spécifie comment interpréter les mots (nom du mois et du jour) rencontrés lors de l'analyse. (La réponse de BalusC gère cela correctement.) De plus, les paramètres régionaux affectent la sortie de certains formateurs lors de la génération d'une représentation sous forme de chaîne de votre date-heure.
Joda-Time
Voici quelques notes sur Joda-Time.
Fuseau horaire
Dans Joda-Time , un objet DateTime connaît vraiment son propre fuseau horaire attribué. Cela contraste avec la classe java.util.Date qui semble avoir un fuseau horaire mais pas.
Notez dans l'exemple de code ci-dessous comment nous passons un objet de fuseau horaire au formateur qui analyse la chaîne. Ce fuseau horaire est utilisé pour interpréter cette date-heure comme s'étant produite dans ce fuseau horaire. Vous devez donc penser et déterminer le fuseau horaire représenté par cette entrée de chaîne.
Comme vous n'avez pas de partie d'heure dans votre chaîne d'entrée, Joda-Time affecte le premier moment du jour du fuseau horaire spécifié comme heure du jour. Habituellement, cela signifie
00:00:00
mais pas toujours, en raison de l' heure d'été (DST) ou d'autres anomalies. Soit dit en passant, vous pouvez faire de même pour n'importe quelle instance DateTime en appelantwithTimeAtStartOfDay
.Modèle de formateur
Les caractères utilisés dans le modèle d'un formateur sont similaires dans Joda-Time à ceux de java.util.Date/Calendar mais pas exactement les mêmes. Lisez attentivement le doc.
Immutabilité
Nous utilisons généralement les classes immuables dans Joda-Time. Plutôt que de modifier un objet Date-Heure existant, nous appelons des méthodes qui créent une nouvelle instance basée sur l'autre objet avec la plupart des aspects copiés sauf là où des modifications étaient souhaitées. Un exemple est l'appel à la
withZone
dernière ligne ci-dessous. L'immutabilité aide à rendre Joda-Time très sûr pour les threads, et peut également rendre certains travaux plus clairs.Conversion
Vous aurez besoin d'objets java.util.Date à utiliser avec d'autres classes / frameworks qui ne connaissent pas les objets Joda-Time. Heureusement, il est très facile de se déplacer d'avant en arrière.
Passer d'un objet java.util.Date (ici nommé
date
) à Joda-Time DateTime…Aller dans l'autre sens de Joda-Time vers un objet java.util.Date…
Exemple de code
Lors de l'exécution ...
la source
Lors de l'utilisation de la classe SimpleDateFormat, il est important de se rappeler que Date n'est pas adapté aux threads et que vous ne pouvez pas partager un seul objet Date avec plusieurs threads.
Il y a aussi une grande différence entre "m" et "M" où la petite caisse est utilisée pour les minutes et la majuscule pour le mois. La même chose avec "d" et "D". Cela peut provoquer des bugs subtils qui sont souvent négligés. Voir Javadoc ou Guide de conversion de chaîne en date en Java pour plus de détails.
la source
Ça fonctionne bien pour moi.
la source
Vous pouvez utiliser SimpleDateformat pour modifier la chaîne à ce jour
la source
De plus, SimpleDateFormat n'est pas disponible avec certaines des technologies côté client, comme GWT .
C'est une bonne idée d'opter pour Calendar.getInstance (), et votre exigence est de comparer deux dates; allez pour longue date.
la source
Deux formateurs simples que nous avons utilisés:
Nous analysons le format complet de la date à l'heure:
la source
Mon humble programme de test. Je l'utilise pour jouer avec le formateur et rechercher les longues dates que je trouve dans les fichiers journaux (mais qui les a mis là ...).
Mon programme de test:
Résultats de test:
la source
Lien source
Pour Android
Calendar.getInstance (). GetTime () donne
Utilisation
la source
Conversion de chaîne en date:
la source
Essaye ça
la source