Format Java AAAA-MM-jj'T'HH: mm: SS.SSSz to AAAA-mm-JJ HH: mm: ss

j'essaie de formater une date dans AAAA-MM-jj'T'HH:mm:SS.Format SSSz à 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 formatteur de date simple pour le formater:

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

pourtant cela donne une sortie similaire à 2012-10-01T09:45:00.000 UTC+00:00.

j'ai aussi essayé d'utiliser "aaaa-MM-jj PAS'HH:mm:ss.SSSZ" comme identifiant et "yyyy-MM-ddHH:mm:ss". Ce dernier renvoie une date sous la forme de 2012-10-01T09:45:00 proche, mais pas encore.

j'ai pensé que soustraire le T serait un peu compliqué et créerait des frais généraux sans raison, donc quelle serait la bonne façon de formater ces dates?

pour illustrer je voudrais convertir 2012-10-01T09: 45:00.000+02:00 en 2012-10-01 09:45: 00

santé!

35
demandé sur Gooey 2013-03-31 18:13:34

6 réponses

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);

ça marche. Vous devez utiliser deuxformats Simpledate, un pour l'entrée et un pour la sortie, mais il vous donnera exactement ce que vous voulez.

63
répondu ctlevi 2013-03-31 15:01:49

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
répondu moleksyuk 2013-03-31 14:58:40

de java.time

nous avons une nouvelle technologie pour ce problème: le java.time framework intégré dans Java 8 et plus tard.

votre chaîne de caractères est au format standard ISO 8601. Cette norme est utilisée par défaut dans le java.classes de temps pour analyser/générer des représentations textuelles des 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 vouliez omettre les informations offset et fuseau horaire. Le formatage prédéfini DateTimeFormatter.ISO_LOCAL_DATE_TIME fait cela.

Et apparemment, vous souhaitez utiliser un espace dans le milieu plutôt que la norme T . Vous pouvez définir votre propre formater pour cela, mais je ferais juste une manipulation de chaîne de caractères pour remplacer le T par un espace.

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

Il Suffit De Manipulations De Chaînes

comme le suggèrent les commentaires sur la Question, à strictement parler, vous pouvez atteindre votre objectif en travaillant uniquement avec des chaînes de caractères et en ne convertissant à aucun objet date-heure. Mais je fournis cette réponse ici en supposant que vous pouvez avoir une autre logique d'affaires pour travailler avec ces valeurs de date-heure.


à Propos de de java.heure

Le de java.heure cadre est intégré dans Java 8 et plus tard. Ces classes remplacent les anciennes héritées classes de date-heure telles que java.util.Date , Calendar , & SimpleDateFormat .

le Joda-Time projet, maintenant dans mode de maintenance , conseille la migration vers le java.temps des classes.

pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .

vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin pour les classes java.sql.* .

où obtenir le java.les classes de temps?

le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'expérimentation pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

5
répondu Basil Bourque 2018-02-28 06:41:17

Si vraiment tu dois être rapide (pas que je crois que vous n'):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
1
répondu Hot Licks 2013-03-31 15:11:02

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. Donc voici ce que j'ai essayé et cela a fonctionné et m'a aidé à assigner la chaîne de date formatée un widget calendrier.

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);

ça a marché. Grâce.

1
répondu Kiran Madanwad 2016-03-17 07:22:26
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 fuseaux horaires selon la norme ISO 8601. Ceci peut être utilisé en Java 7.

0
répondu Sangram Badi 2017-02-17 09:05:00