【问题标题】:java.text.ParseException while trying to parse a date in javajava.text.ParseException 尝试在 java 中解析日期
【发布时间】:2014-04-16 19:47:43
【问题描述】:

我无法将字符串“16 Apr 2014 17:00”解析为字符串。我试图在apachecommons 库中使用DateUtils。这是有异常的测试代码

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

堆栈跟踪如下所示;

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)

编辑:问题是我必须将默认语言环境设置为 en_US,即使我的 JVM 显示我的默认设置是 en_US。这是代码。

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

}

输出是

en_US
Fri Apr 18 20:00:00 EEST 2014

【问题讨论】:

    标签: java date apache-commons datetime-format


    【解决方案1】:

    从您的个人资料来看,您似乎在土耳其。因此,如果parseDate 使用默认的Locale,它可能使用土耳其语LocaleApr 不是该月土耳其语单词的简写。

    考虑使用你自己的SimpleDateFormat,在那里你可以设置一个英文Locale(除非DateUtils有这样的方法)。

    否则,请尝试使用土耳其语(速记)词来解析四月的日期。

    检查源,我找不到任何问题。请尝试

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

    【讨论】:

    • 这是一种邪恶的回答方式 :) +1
    • 感谢您的回答,但是,Locale.getDefault() 提供了en_US,所以 Locale 应该没有问题?
    • @quartaela 不,我认为你不应该有问题。我会删除并进一步调查
    • @quartaela 尝试在之前设置默认的Locale。我无法重现您的问题。
    • @quartaela 最后一件事,因为我有点想不通,Locale.getDefault(Locale.Category.FORMAT) 的输出是什么?一样的吗?
    【解决方案2】:

    您的测试为我运行。您使用的是哪个版本的 commons-lang?我正在使用:

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

    在这个 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)
    

    【讨论】:

    • 我的是&lt;dependency&gt;&lt;groupId&gt;org.apache.commons&lt;/groupId&gt;&lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;&lt;version&gt;3.3.1&lt;/version&gt;&lt;/dependency&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多