Conversion d'une chaîne de date en un objet DateTime à l'aide de la bibliothèque Joda Time

246

J'ai une date sous forme de chaîne au format suivant "04/02/2011 20:27:05". J'utilise la bibliothèque Joda-Time et je voudrais la convertir en DateTimeobjet. J'ai fait:

DateTime dt = new DateTime("04/02/2011 20:27:05")

Mais j'obtiens l'erreur suivante:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

Comment convertir la date ci-dessus en DateTimeobjet?

À M
la source
2
Pour ceux qui arrivent ici et qui cherchent à analyser les chaînes de date à l'aide du java.timepackage dans Java 8, essayez d'utiliser LocalDateTime.parseou Instant.parse.
heenenee
1
Pour info, le projet Joda-Time est désormais en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque

Réponses:

477

Utilisation DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);
Bozho
la source
2
Salut, est-il possible que le formateur n'accepte pas les fuseaux horaires? « zz » retours « MEZ », lors de l' application de la toStringfonction, mais je ne peux pas analyser de lui: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". est-ce un problème connu? Comment puis-je l'éviter? Cordialement.
Danyel
2
@Danyel: Vous pouvez ajouter des fuseaux horaires comme celui-ci DateTimeFormat.forPattern ("aaaa-MM-jj'T'HH: mm: ss.SSS'Z '"). AvecLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque
2
J'obtiens un format non valide: "2014-11-04T17: 41: 52.000 + 01: 00" est mal formé à "+01: 00" avec le formateur suivant: private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3])) sur joda-time 2.2
Stephane
2
Après avoir supprimé les guillemets simples autour de la ZZ, cela a fonctionné. Je me demande ce que ces citations simples signifient ...
Stephane
2
@StephaneEybert (ou n'importe qui d'autre) Les guillemets simples signifient que quelque chose est un caractère littéral à prévoir dans la chaîne et ne doit pas être considéré comme faisant partie du modèle. Par exemple: si votre date arrive en tant que "2015-08-dd30" pour une raison quelconque, vous devez spécifier "aaaa-MM-'dd'dd", indiquant que le premier jj est une partie littérale attendue dans la chaîne, et le deuxième dd (en dehors des apostrophes) est le jour réel qui doit être analysé. Donc, dans votre cas précédent, cela aurait fonctionné si, au lieu du fuseau horaire réel, vous aviez mis "ZZ" à la fin de votre chaîne datetime entrante.
SadBunny
62

Je sais que c'est une vieille question, mais je voulais ajouter que, depuis JodaTime 2.0, vous pouvez le faire avec un one-liner:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
stephen.hanson
la source
3
Que dois-je mettre dans la section d'importation?
Dmitry
20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
Shawn Vader
la source
7
Doit être: DateTimeFormat.forPattern ("jj / MM / aaaa HH: mm: ss"). ParseDateTime ("04/02/2011 20:27:05")
sufinawaz
16

Parmi les commentaires, j'ai choisi une réponse comme et en ajoutant également TimeZone:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);
Ali Karaca
la source
13

Votre format n'est pas le format ISO attendu, vous devriez essayer

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");
Karl-Bjørnar Øie
la source
5

Vous pouvez également utiliser SimpleDateFormat , comme dansDateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}
efirat
la source
3
kirlisakal ne le fait pas dans ce cas, mais ne créez pas d'instance partagée d'un SimpleDateFormat car il n'est pas thread-safe, c'est un cauchemar à déboguer si vous le faites
dannrob
2
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir Tutorial by Oracle . Et les classes java.time sont thread-safe, contrairement aux classes héritées.
Basil Bourque
3

Vous avez besoin d'un DateTimeFormatter approprié au format que vous utilisez. Jetez un œil aux documents pour savoir comment en créer un.

Je pense que tu as besoin format = DateTimeFormat.forPattern("M/d/y H:m:s")

Mark Tozzi
la source
3

tl; dr

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

L'approche moderne utilise les classes java.time qui supplantent le vénérable Joda-Time projet .

Analyser aussi LocalDateTimecar votre entrée n'a aucun indicateur de fuseau horaire ou de décalage par rapport à UTC.

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02-04T20: 27: 05

Conseil: Dans la mesure du possible, utilisez les formats ISO 8601 standard lors de l'échange de valeurs date-heure sous forme de texte plutôt que dans le format affiché ici. De manière pratique, les classes java.time utilisent les formats standard lors de l'analyse / génération de chaînes.


À propos de 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, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time classes .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

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 de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
2

Une méthode simple:

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}
sissi49
la source
0

Il y a deux façons d' y parvenir .

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011
Dulith De Costa
la source
Les deux sont obsolètes. Il existe également une méthode moderne; c'est dans la réponse de Basil Bourque . De plus, vous ne contribuez à rien qui ne figure pas déjà dans plusieurs autres réponses. Et lorsque Joda-Time est demandé, suggérer que le plus ancien et le plus ennuyeux SimpleDateFormatest notoirement mauvais à mon avis le plus honnête.
Ole VV