Caractère de motif illégal ' T ' lors de l'analyse d'une chaîne de date en java.util.Date
j'ai une chaîne de date et je veux l'analyser à la date normale utiliser l'API Date java,ce qui suit est mon code:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
cependant j'ai eu une exception: java.lang.IllegalArgumentException: Illegal pattern character 'T'
donc je me demande si je dois couper la corde et la Parser manuellement?
BTW, j'ai essayé d'ajouter un seul caractère de citation de chaque côté du T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Il ne fonctionne pas.
2 réponses
mise à jour pour Java 8 et plus
vous pouvez maintenant simplement faire Instant.parse("2015-04-28T14:23:38.521Z")
et obtenir la chose correcte maintenant, d'autant plus que vous devriez utiliser Instant
au lieu de la cassée java.util.Date
avec les versions les plus récentes de Java.
vous devriez utiliser DateTimeFormatter
au lieu de SimpleDateFormatter
aussi.
Réponse Originale:
l'explication ci-dessous est toujours valable en tant que ce format représente. Mais il a été écrit avant que Java 8 était ubiquitous ainsi il utilise le vieux classes que vous ne devriez pas utiliser si vous utilisez Java 8 ou supérieur.
cela fonctionne avec l'entrée avec l'arrière Z
comme démontré:
dans le dessin le
T
est échappé avec'
de chaque côté.le modèle de La
Z
à la fin est en faitXXX
comme documenté dans le JavaDoc pourSimpleDateFormat
, il n'est pas très clair sur réellement comment l'utiliser depuisZ
est le marqueur pour le vieuxTimeZone
de l'information.
Q2597083.java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class Q2597083
{
/**
* All Dates are normalized to UTC, it is up the client code to convert to the appropriate TimeZone.
*/
public static final TimeZone UTC;
/**
* @see <a href="http://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">Combined Date and Time Representations</a>
*/
public static final String ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
/**
* 0001-01-01T00:00:00.000Z
*/
public static final Date BEGINNING_OF_TIME;
/**
* 292278994-08-17T07:12:55.807Z
*/
public static final Date END_OF_TIME;
static
{
UTC = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(UTC);
final Calendar c = new GregorianCalendar(UTC);
c.set(1, 0, 1, 0, 0, 0);
c.set(Calendar.MILLISECOND, 0);
BEGINNING_OF_TIME = c.getTime();
c.setTime(new Date(Long.MAX_VALUE));
END_OF_TIME = c.getTime();
}
public static void main(String[] args) throws Exception
{
final SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_24H_FULL_FORMAT);
sdf.setTimeZone(UTC);
System.out.println("sdf.format(BEGINNING_OF_TIME) = " + sdf.format(BEGINNING_OF_TIME));
System.out.println("sdf.format(END_OF_TIME) = " + sdf.format(END_OF_TIME));
System.out.println("sdf.format(new Date()) = " + sdf.format(new Date()));
System.out.println("sdf.parse(\"2015-04-28T14:23:38.521Z\") = " + sdf.parse("2015-04-28T14:23:38.521Z"));
System.out.println("sdf.parse(\"0001-01-01T00:00:00.000Z\") = " + sdf.parse("0001-01-01T00:00:00.000Z"));
System.out.println("sdf.parse(\"292278994-08-17T07:12:55.807Z\") = " + sdf.parse("292278994-08-17T07:12:55.807Z"));
}
}
produit la sortie suivante:
sdf.format(BEGINNING_OF_TIME) = 0001-01-01T00:00:00.000Z
sdf.format(END_OF_TIME) = 292278994-08-17T07:12:55.807Z
sdf.format(new Date()) = 2015-04-28T14:38:25.956Z
sdf.parse("2015-04-28T14:23:38.521Z") = Tue Apr 28 14:23:38 UTC 2015
sdf.parse("0001-01-01T00:00:00.000Z") = Sat Jan 01 00:00:00 UTC 1
sdf.parse("292278994-08-17T07:12:55.807Z") = Sun Aug 17 07:12:55 UTC 292278994
tl; dr
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601
ce format est défini par la norme ISO 8601 pour les formats de chaîne date-heure.
les deux:
- de java.time framework intégré dans Java 8 et plus tard ( Tutorial )
- Joda-Time library
...utiliser les formats ISO 8601 par défaut pour l'analyse et la génération de chaînes.
vous devriez généralement éviter d'utiliser l'ancien java.util.Date /.CALENDRIER & java.texte.SimpleDateFormat classes car ils sont notoirement gênants, confus, et défectueux. Si nécessaire pour l'interopérabilité, vous pouvez convertir vers et vers.
de java.time
intégré dans Java 8 et plus tard est le nouveau Java.temps cadre de. Inspiré par Joda-Time , défini par JSR 310 , et prolongé par le ThreeTen-Extra projet.
Instant instant = Instant.parse( "2010-10-02T12:23:23Z" ); // `Instant` is always in UTC.
Convertissez-vous à l'ancienne classe.
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
Fuseau Horaire
Si nécessaire, vous pouvez assigner un fuseau horaire.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
Convert.
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
Joda-Time
mise à jour: le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille la migration vers le java .temps classes.
voici un exemple de code dans Joda-Time 2.8.
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
Convertissez-vous en vieille classe. Notez que le fuseau horaire assigné est perdu dans la conversion, comme J. U. La Date ne peut pas être assignée à un fuseau horaire.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
Fuseau Horaire
Si nécessaire, vous pouvez assigner un fuseau horaire.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
à Propos de de java.heure
Le de java.time framework est construit 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 beaucoup des exemples et des explications. La spécification est JSR 310 .
vous pouvez échanger java.temps objets directement avec votre base de données. Utilisez un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de Chaînes, pas besoin de 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 paquet Android de java.les classes de temps.
- pour les Android (<26), le ThreeTenABP project adapts ThreeTen-Backport (mentionné ci-dessus). Voir comment utiliser ThreeTenABP... .
ThreeTen-Extra " le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval
, YearWeek
, YearQuarter
, et plus .