web-dev-qa-db-fra.com

Java format aaaa-MM-jj'H'HH: mm: ss.SSSz à aaaa-mm-jj HH: mm: ss

J'essaie de formater une date au format aaaa-MM-jj'H'HH: mm: ss.SSSz en aaaa-mm-jj HH: mm: ss, ce qui devrait être facile mais je n'arrive pas à le faire fonctionner .

Une date qui doit être analysée est sous la forme de: 2012-10-01T09: 45: 00.000 + 02: 00
Maintenant, j'utilise ce formateur de date simple pour le formater:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE);

pourtant, cela donne un résultat similaire à 2012-10-01T09: 45: 00.000UTC + 00: 00.

J'ai également essayé d'utiliser "aaaa-MM-jj'T'HH: mm: ss.SSSZ" comme motif et "aaaa-MM-jjHH: mm: ss". Ce dernier renvoie une date sous la forme 2012-10-01T09: 45: 00 close, mais pas encore là.

Je pensais que sous-chaîne du T serait un peu brouillon et créerait une surcharge sans raison, donc quelle serait la bonne façon de formater ces dates?

Pour illustrer mon propos, j'aimerais convertir le 12/10/2012 au 01/10/2012: 45: 00.000 + 02: 00 au 2012-10-01 09:45:00

À votre santé!

42
Gooey
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(time);
String formattedTime = output.format(d);

Cela marche. Vous devez utiliser deux SimpleDateFormats, un pour l'entrée et un pour la sortie, mais cela vous donnera exactement ce que vous voulez.

77
ctlevi

Gooye s'il est possible d'utiliser Joda Time dans votre projet, alors ce code fonctionne pour moi:

String dateStr = "2012-10-01T09:45:00.000+02:00";
String customFormat = "yyyy-MM-dd HH:mm:ss";

DateTimeFormatter dtf = ISODateTimeFormat.dateTime();
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr);

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat));
System.out.println(dateWithCustomFormat);
8
moleksyuk

Java.time

Nous avons une nouvelle technologie pour ce problème: le framework Java.time intégré à Java 8 et versions ultérieures.

Votre chaîne de saisie est au format standard ISO 8601. Cette norme est utilisée par défaut dans les classes Java.time pour analyser/générer des représentations textuelles de valeurs date-heure.

_OffsetDateTime odt = OffsetDateTime.parse( "2012-10-01T09:45:00.000+02:00" );
_

Votre question suggère que vous voulez tronquer à une seconde entière.

_OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );
_

Il semble que vous souhaitiez omettre les informations de décalage et de fuseau horaire. Le formateur prédéfini DateTimeFormatter.ISO_LOCAL_DATE_TIME le fait.

Et apparemment, vous voulez utiliser un espace au milieu plutôt que le T standard. Vous pouvez définir votre propre formateur pour cela, mais je voudrais juste faire une manipulation de chaîne pour remplacer le T par un SPACE.

_String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );
_

Simplement des manipulations de cordes

Comme le suggèrent les commentaires sur la Question, vous pouvez atteindre votre objectif à la lettre en travaillant uniquement avec des chaînes et en ne convertissant aucun objet date/heure. Mais je fournis cette réponse ici en supposant que vous puissiez avoir une autre logique métier pour travailler avec ces valeurs date-heure.


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes legacy date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat =.

Le projet Joda-Time , maintenant en mode de maintenance , conseille la migration vers Java.time classes.

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

Vous pouvez échanger des objets directement avec votre base de données Java.time Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de _Java.sql.*_ classes.

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 d’éventuels ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval , YearWeek , YearQuarter , et plus .

8
Basil Bourque

J'essayais de formater la chaîne de date reçue d'une réponse JSON, par exemple. 2016-03-09T04: 50: 00-0800 à aaaa-MM-jj. Alors voici ce que j'ai essayé et cela a fonctionné et m'a aidé à attribuer un widget de calendrier à la chaîne de date formatée.

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss";
String DATE_FORMAT_O = "yyyy-MM-dd";


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I);
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O);

Date date = formatInput.parse(member.getString("date"));
String dateString = formatOutput.format(date);

Cela a fonctionné. Merci.

3
Kiran Madanwad

Si tu dois vraiment être rapide (pas que je crois que tu le fais):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
1
Hot Licks
String dateStr = "2016-09-17T08:14:03+00:00";
String s = dateStr.replace("Z", "+00:00");
s = s.substring(0, 22) + s.substring(23);
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
Timestamp createdOn = new Timestamp(date.getTime());
mcList.setCreated_on(createdOn);

Java 7 a ajouté la prise en charge des descripteurs de fuseau horaire selon ISO 8601. Ceci peut être utilisé dans Java 7.

0
Sangram Badi