java.text.ParseException while trying to parse a date in java

一笑奈何 提交于 2019-12-24 14:01:54

问题


I can not parse the string "16 Apr 2014 17:00" as a string. I've trying to use DateUtils in apachecommons library. here is the test code with the exception

package com.buraktas;

import java.text.ParseException;
import java.util.Date;

import org.apache.commons.lang3.time.DateUtils;
import org.junit.Test;

public class ParseDateTest {

    @Test
    public void test() throws ParseException {

        String date = "18 Apr 2014 20:00";
        Date parseDate = DateUtils.parseDate(date, "dd MMM yyyy HH:mm");

        System.out.println(parseDate);
    }
}

and the stacktrace is like below;

java.text.ParseException: Unable to parse the date: 18 Apr 2014 20:00
    at org.apache.commons.lang3.time.DateUtils.parseDateWithLeniency(DateUtils.java:391)
    at org.apache.commons.lang3.time.DateUtils.parseDate(DateUtils.java:291)
    at org.apache.commons.lang3.time.DateUtils.parseDate(DateUtils.java:268)
    at com.buraktas.ParseDateTest.test(ParseDateTest.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

EDIT: The thing is I have to setup default locale to en_US even my JVM shows that my default is en _US. Here is the code.

@Test
public void testParse2() throws Exception {

    System.out.println(Locale.getDefault());

    String date = "18 Apr 2014 20:00";
    Locale.setDefault(Locale.ENGLISH);

    Date parseDate = DateUtils.parseDate(date, new String[] { "dd MMM yyyy HH:mm" });
    System.out.println(parseDate);

}

and the output is

en_US
Fri Apr 18 20:00:00 EEST 2014

回答1:


From your profile, it seems you are in Turkey. As such, if parseDate uses the default Locale, it may be using a Turkish Locale. Apr is not a shorthand for the Turkish word for that month.

Consider using your own SimpleDateFormat where you can set an English Locale (unless DateUtils has such a method).

Otherwise, try parsing a date with the Turkish (shorthand) word for April.

Inspecting the source, I can't find anything wrong. Please try

String date = "18 Apr 2014 20:00";
Locale.setDefault(Locale.US);

Date parseDate = DateUtils.parseDate(date, new String[] { "dd MMM yyyy HH:mm" });
System.out.println(parseDate);



回答2:


Your test runs for me. What version of commons-lang are you using? I'm using:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.2.1</version>
        <scope>compile</scope>
    </dependency>

on this JDK:

thor ~ $ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)


来源:https://stackoverflow.com/questions/23118817/java-text-parseexception-while-trying-to-parse-a-date-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!