Ik krijg een parsing-uitzondering terwijl ik de volgende code probeer:
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Uitzondering:
Uitzondering in draad “Main” Java.text.parseexception: Ongepareerde datum: “SAT JUN 01 12:53:10 IST 2013”
bij Com.ibm.icu.Text.DateFormat.parse (DateFormat.java:510)
Invoer: Sat Jun 01 12:53:10 IST 2013
Verwachte output: Jun 01,2013 12:53:10
Hoe oplossen dit?
Antwoord 1, Autoriteit 100%
Uw patroon komt helemaal niet overeen met de invoerkoord … het is niet verrassend dat het niet werkt. Dit zou waarschijnlijk beter werken:
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
Locale.ENGLISH);
Duidelijk afdrukken met uw gewenste indeling heeft u een tweede simpledateformat:
Date parsedDate = sdf.parse(date);
SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
System.out.println(print.format(parsedDate));
Opmerkingen:
- U dient de locale op te nemen alsof uw locale geen Engels is, de dagnaam wordt mogelijk niet herkend
- ist is dubbelzinnig en kan leiden tot problemen , zodat u de juiste tijdzone-naam indien mogelijk in uw invoer.
Antwoord 2, Autoriteit 7%
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
Date currentdate=sdf.parse(date);
SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
System.out.println(sdf2.format(currentdate));
Antwoord 3, Autoriteit 5%
Patroon is verkeerd
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Antwoord 4, Autoriteit 3%
Update uw formaat naar:
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
Antwoord 5, Autoriteit 3%
- Uw opmaakpatroon komt niet overeen met de invoerreeks, zoals opgemerkt door andere antwoorden.
- Uw invoerformaat is verschrikkelijk .
- U gebruikt lastige oude datum-tijdlessen die jaren geleden door de Java.Tijd -klassen werden meegeleverd.
ISO 8601
In plaats daarvan een indeling zoals de jouwe, gebruik ISO 8601 standaardformaten voor het uitwisselen van datum-tijd waarden als tekst.
De JAVA.TIME -klassen gebruiken standaard de standaard ISO 8601-indelingen bij het parseren / genereren van snaren.
juiste tijdzonaam
Geef een juiste tijdzonenaamop in de notatie continent/region
, zoals America/Montreal
, Africa/Casablanca
, of Pacific/Auckland
. Gebruik nooit de afkorting van 3-4 letters zoals EST
of IST
aangezien het geenechte tijdzones zijn, niet gestandaardiseerd en zelfs niet uniek( !).
Uw IST
kan Iceland Standard Time, India Standard Time, Ireland Standard Timeof andere betekenen. De klassen java.timeworden overgelaten aan slechts gissen, aangezien er geen logische oplossing is voor deze dubbelzinnigheid.
java.time
De moderne aanpak maakt gebruik van de java.timeklassen.
Definieer een opmaakpatroon dat overeenkomt met uw invoerreeksen.
String input = "Sat Jun 01 12:53:10 IST 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString(): 2013-06-01T12:53:10Z[Atlantic/Reykjavik]
Als je invoer niet voor IJsland bedoeld was, moet je de tekenreeks voorbereiden om deze aan te passen aan een juiste tijdzonenaam. Als u er bijvoorbeeld zeker van bent dat de invoer voor India was bedoeld, wijzigt u IST
in Asia/Kolkata
.
String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString(): 2013-06-01T12:53:10+05:30[Azië/Kolkata]
Over java.time
De java.timeframework is ingebouwd in Java 8 en hoger. Deze klassen vervangen de lastige oude legacydatum-tijdklassen zoals java.util.Date
, Calendar
, & SimpleDateFormat
.
Zie voor meer informatie de Oracle-zelfstudie. En zoek Stack Overflow voor veel voorbeelden en uitleg. Specificatie is JSR 310.
Het Joda-Time-project, nu in onderhoudsmodus, adviseert migratie naar de java.timeklassen.
U kunt java.timeobjecten rechtstreeks uitwisselen met uw database. Gebruik een JDBC-stuurprogrammadat voldoet aan JDBC 4.2of hoger. Geen strings nodig, geen java.sql.*
klassen. Slaapstand 5 & JPA 2.2 ondersteunt java.time.
Waar zijn de java.time-klassen te verkrijgen?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11en later – Onderdeel van de standaard Java API met een gebundelde implementatie.
- Java 9bracht enkele kleine functies en oplossingen .
- Java SE 6en Java SE 7
- De meeste java.time-functionaliteit is teruggekoppeld naar Java 6 & 7 in ThreeTen-Backport.
- Android
- Latere versies van Android (26+) bundelen implementaties van de klassen java.time.
- Voor eerdere Android (<26), het proces van API-ontsuikeringbrengt een subset van de java.time-functionaliteit die oorspronkelijk niet in Android was ingebouwd.
- Als de ontsuikering niet biedt wat je nodig hebt, de ThreeTenABPproject past ThreeTen-Backport(hierboven vermeld) naar Android. Zie ThreeTenABP gebruiken….
Antwoord 6, autoriteit 2%
Ik heb een eenvoudige oplossing gevonden om de huidige datum te krijgen zonder enige parseerfout.
Calendar calendar;
calendar = Calendar.getInstance();
String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
Antwoord 7
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Dit patroon komt niet overeenmet uw invoertekenreeksdie de uitzonderingvormt.
Je moet het volgende patroongebruiken om het werk gedaan te krijgen.
E MMM dd HH:mm:ss z yyyy
De volgende code helpt u bij Skip de uitzondering .
SimpleDateFormat
is gebruikt .
String date="Sat Jun 01 12:53:10 IST 2013"; // Input String
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern
Date currentdate=simpleDateFormat.parse(date); // Returns Date Format,
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern
System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern
// outputs: Jun 01,2013 12:53:10
Antwoord 8
Controleer uw patroon (DD-MMM-JJJJ) en de invoer voor de parse (“29-11-2018”) -methode.
Ingang op de parse-methode moet volgen: DD-MMM-JJJJ I, E. 21-aug-2019
in mijn code:
String pattern = "DD-MMM-YYYY";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
startDate = simpleDateFormat.parse("29-11-2018");// here no pattern match
endDate = simpleDateFormat.parse("28-AUG-2019");// Ok
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Antwoord 9
Ik moest een ParsePosition
Expressie toe toevoegen aan de PARSE-methode van Klasse SimpleDateFormat
:
simpledateformat.parse(mydatestring, new ParsePosition(0));