Quel est le meilleur moyen de convertir une String
au format '2 janvier 2010' en un Date
en Java?
En fin de compte, je veux diviser le mois, le jour et l’année sous forme d’entiers pour pouvoir utiliser
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
convertir la date en heure.
C'est la méthode difficile, et ces méthodes de définition _Java.util.Date
_ sont obsolètes depuis Java 1.1 (1997). Formatez simplement la date en utilisant SimpleDateFormat
en utilisant un modèle de format correspondant à la chaîne d'entrée .
Dans votre cas spécifique de "2 janvier 2010" en tant que chaîne d'entrée:
MMMM
pour celad
pour cela.yyyy
pour elle._String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
_
Notez l’importance de l’argument explicite Locale
. Si vous l'omettez, il utilisera alors paramètres régionaux par défaut , qui n'est pas nécessairement anglais tel qu'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 avec confusion un _Java.text.ParseException
_ même si le modèle de format semble être valide.
Voici un extrait de pertinence de le javadoc , listant tous les modèles de format disponibles:
_Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
_
Notez que les modèles sont sensibles à la casse et que les modèles de quatre caractères ou plus basés sur du texte représentent la forme complète; sinon, une forme abrégée ou abrégée est utilisée si elle est disponible. Donc, par exemple MMMMM
ou plus est inutile.
Voici quelques exemples de modèles SimpleDateFormat
valides pour analyser une chaîne donnée à ce jour:
_Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
_
Une remarque importante est que SimpleDateFormat
est pas thread-safe. En d'autres termes, vous ne devez jamais le déclarer et l'affecter en tant que variable statique ou instance, puis le réutiliser à partir de différentes méthodes/threads. Vous devez toujours le créer complètement dans la portée locale de la méthode.
Si vous êtes sur Java 8 ou plus récent, 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 par JodaTime .
_String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
_
Remarque: si votre modèle de format contient également la partie heure, utilisez LocalDateTime#parse(text, formatter)
au lieu de LocalDate#parse(text, formatter)
. Et, si votre modèle de format contient également le fuseau horaire, utilisez plutôt ZonedDateTime#parse(text, formatter)
.
Voici un extrait de pertinence de le javadoc , listant tous les modèles de format disponibles:
_Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
_
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 utiliser _DateTimeFormatter.RFC_1123_DATE_TIME
_. Cela est possible car ils sont, au contraire de SimpleDateFormat
, thread safe. Vous pouvez donc également définir le vôtre, si nécessaire.
Pour un format de chaîne d'entrée particulier, il n'est pas nécessaire d'utiliser une DateTimeFormatter
explicite: une norme ISO 8601 date, comme 2016-09-26T17: 44: 57Z, peut être analysée directement avec LocalDateTime#parse(text)
car il utilise déjà le formateur ISO_LOCAL_DATE_TIME
. De même, LocalDate#parse(text)
analyse une date ISO sans le composant heure (voir ISO_LOCAL_DATE
), et ZonedDateTime#parse(text)
analyse une date ISO avec un décalage et fuseau horaire ajouté (voir ISO_ZONED_DATE_TIME
).
Ah oui le Java Date discussion, encore. Pour traiter la manipulation de date, nous utilisons Date , Calendrier , GregorianCalendar , et SimpleDateFormat . Par exemple, en utilisant votre date de janvier comme entrée:
Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
Ensuite, vous pouvez manipuler cela avec quelque chose comme:
Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);
Avec Java 8, nous obtenons une nouvelle API Date/Time ( JSR 31 ).
La méthode suivante peut être utilisée pour analyser la date dans Java 8 sans s'appuyer sur Joda-Time :
String str = "January 2nd, 2010";
// if we 2nd even we have changed in pattern also it is not working please workout with 2nd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);
// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1
LocalDate est la classe standard Java 8 permettant de représenter une date (sans heure). Si vous souhaitez analyser des valeurs contenant des informations de date et d'heure, utilisez LocalDateTime . Pour les valeurs avec des fuseaux horaires, utilisez ZonedDateTime . Les deux fournissent une méthode parse()
similaire à LocalDate
:
LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);
La liste des caractères de formatage de DateTimeFormatter Javadoc :
All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters.
The following pattern letters are defined:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
Bien que certaines des réponses soient techniquement correctes, elles ne sont pas souhaitables.
Suivent quelques notes sur Joda-Time.
Dans Joda-Time , un objet DateTime connaît réellement son propre fuseau horaire. Cela met en contraste la classe Java.util.Date qui semble avoir un fuseau horaire mais ne l’a 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’il s’est produit dans ce fuseau horaire. Vous devez donc réfléchir et déterminer le fuseau horaire représenté par cette entrée de chaîne.
Comme vous n'avez pas de portion d'heure dans votre chaîne d'entrée, Joda-Time assigne le premier moment du jour du fuseau horaire spécifié comme heure du jour. Cela signifie généralement 00:00:00
mais pas toujours, à cause de Heure d'été ou d'autres anomalies. En passant, vous pouvez faire de même pour n’importe quelle instance DateTime en appelant withTimeAtStartOfDay
.
Les caractères utilisés dans le modèle d'un formateur sont similaires dans Joda-Time à ceux de Java.util.Date/Calendar mais ne sont pas exactement les mêmes. Lisez attentivement le doc.
Nous utilisons habituellement les classes immuables dans Joda-Time. Plutôt que de modifier un objet Date-Time 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 pour les modifications souhaitées. Un exemple est l'appel à withZone
dans la dernière ligne ci-dessous. Immutability contribue à rendre Joda-Time très thread-safe, et peut également rendre certains travaux plus clairs.
Vous aurez besoin d'objets Java.util.Date à utiliser avec d'autres classes/infrastructures qui ne connaissent pas les objets Joda-Time. Heureusement, il est très facile d'aller et venir.
En partant d'un objet Java.util.Date (nommé ici date
) vers Joda-Time DateTime…
org.joda.time.DateTime dateTime = new DateTime( date, timeZone );
Passage de Joda-Time dans l’autre sens à un objet Java.util.Date…
Java.util.Date date = dateTime.toDate();
String input = "January 2, 2010";
Java.util.Locale locale = Java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );
Quand couru…
dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
Lorsque vous traitez avec la classe SimpleDateFormat, il est important de garder à l'esprit que Date n'est pas thread-safe et que vous ne pouvez pas partager un seul objet Date avec plusieurs threads.
De plus, il existe une grande différence entre "m" et "M", où les minuscules sont utilisées pour les minutes et les majuscules pour le mois. La même chose avec "d" et "D". Cela peut causer 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.
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = dateFormat.parse("2013-12-4");
System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013
String output = dateFormat.format(date);
System.out.println(output); // 2013-12-04
}
catch (ParseException e) {
e.printStackTrace();
}
Ça fonctionne bien pour moi.
Deux formateurs simples que nous avons utilisés:
Nous analysons le format complet date-heure:
date="2016-05-06 16:40:32";
public static String setDateParsing(String date) throws ParseException {
// This is the format date we want
DateFormat mSDF = new SimpleDateFormat("hh:mm a");
// This format date is actually present
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
return mSDF.format(formatter.parse(date));
}
En outre, SimpleDateFormat n'est pas disponible avec certaines des technologies côté client, telles que GWT .
C’est une bonne idée d’utiliser Calendar.getInstance (), et votre exigence est de comparer deux dates; aller pour long date.
Mon programme de test humble. Je l'utilise pour jouer avec le formateur et rechercher des dates longues que je trouve dans les fichiers journaux (mais qui les a mises là ...).
Mon programme de test:
package be.test.package.time;
import Java.text.DateFormat;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.ArrayList;
import Java.util.Date;
import Java.util.List;
import Java.util.TimeZone;
public class TimeWork {
public static void main(String[] args) {
TimeZone timezone = TimeZone.getTimeZone("UTC");
List<Long> longs = new ArrayList<>();
List<String> strings = new ArrayList<>();
//Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
//Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
formatter.setTimeZone(timezone);
Date now = new Date();
//Test dates
strings.add(formatter.format(now));
strings.add("01-01-1970 00:00:00.000");
strings.add("01-01-1970 00:00:01.000");
strings.add("01-01-1970 00:01:00.000");
strings.add("01-01-1970 01:00:00.000");
strings.add("01-01-1970 10:00:00.000");
strings.add("01-01-1970 12:00:00.000");
strings.add("01-01-1970 24:00:00.000");
strings.add("02-01-1970 00:00:00.000");
strings.add("01-01-1971 00:00:00.000");
strings.add("01-01-2014 00:00:00.000");
strings.add("31-12-1969 23:59:59.000");
strings.add("31-12-1969 23:59:00.000");
strings.add("31-12-1969 23:00:00.000");
//Test data
longs.add(now.getTime());
longs.add(-1L);
longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
longs.add(1L);
longs.add(1000L);
longs.add(60000L);
longs.add(3600000L);
longs.add(36000000L);
longs.add(43200000L);
longs.add(86400000L);
longs.add(31536000000L);
longs.add(1388534400000L);
longs.add(7260000L);
longs.add(1417706084037L);
longs.add(-7260000L);
System.out.println("===== String to long =====");
//Show the long value of the date
for (String string: strings) {
try {
Date date = formatter.parse(string);
System.out.println("Formated date : " + string + " = Long = " + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
System.out.println("===== Long to String =====");
//Show the date behind the long
for (Long lo : longs) {
Date date = new Date(lo);
String string = formatter.format(date);
System.out.println("Formated date : " + string + " = Long = " + lo);
}
}
}
Résultats du test:
===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000
Vous pouvez utiliser SimpleDateformat pour changer la chaîne à la date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());
Source Lien
Pour Android
Calendar.getInstance (). GetTime () donne
Thu Jul 26 15:54:13 GMT+05:30 2018
Utilisez
String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);