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é!
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.
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);
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?
- Java SE 8 , Java SE 9 , et plus tard
- Built-in.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et Java SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
- versions ultérieures des implémentations du pack Android de java.les classes de temps.
- Pour plus tôt Android, le ThreeTenABP "1519230920 projet" s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir comment utiliser ThreeTenABP... .
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 .
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);
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.
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.