java - Joda Time ,解析不起作用

标签 java jodatime

我有这段代码,但不知道为什么它不起作用

String dateTime = "Sun, 18 Apr 2004 02:32:43";
// Format for input
org.joda.time.format.DateTimeFormatter dtf = DateTimeFormat.forPattern("EEE, dd MMM yyyy kk:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
org.joda.time.format.DateTimeFormatter dtfOut = DateTimeFormat.forPattern("dd MMM yyyy kk:mm:ss");
// Printing the date

我得到的错误:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "Sun, 18 Apr 2004 02:32:43"
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945)
    at com.jbd.WeirdCutEmails.test(WeirdCutEmails.java:69)
    at com.jbd.WeirdCutEmails.main(WeirdCutEmails.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

最佳答案

(感谢 Tom 的建议)

这很可能是 Locale 问题:如果您的默认 Locale 无法识别“Sun”和“Apr”,那么 DateTimeFormatter 将抛出一个 IllegalArgumentException

您可以使用 withLocale(Locale locale) 来解决这个问题:

DateTimeFormat.forPattern("EEE, dd MMM yyyy kk:mm:ss")
    .withLocale(Locale.ENGLISH)

插图:

@Before
public void setUp() throws Exception {
    Locale.setDefault(new Locale("pt", "BR"));
}

@Test(expected = IllegalArgumentException.class)
public void testDefaultFormatterWontParseDifferentLocale() {
    //arrange
    DateTimeFormatter dtf = DateTimeFormat.forPattern("EEE, dd MMM yyyy kk:mm:ss");

    //act
    dtf.parseDateTime("Sun, 18 Apr 2004 02:32:43"); //won't parse as expecting a String in Portuguese Locale
}

@Test
public void testFormatterWithSuppliedLocale() {
    //arrange
    DateTimeFormatter dtf = DateTimeFormat
                                .forPattern("EEE, dd MMM yyyy kk:mm:ss")
                                .withLocale(Locale.ENGLISH);

    //act
    DateTime actualDateTime = dtf.parseDateTime("Sun, 18 Apr 2004 02:32:43");

    //assert
    Assert.assertEquals(new DateTime(2004,4,18,2,32,43), actualDateTime);
}

@After
public void tearDown() throws Exception {
    Locale.setDefault(new Locale("en","US"));
}

关于java - Joda Time ,解析不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673212/

相关文章:

java - 给定最终 block 未正确填充的异常

java - 如何从JAVA中的任何类列表中复制特定字段?

java - 对我的所有 Volley 请求使用自定义 header 时出现问题

java - 计算与另一个时区的小时差

java - 如何使用 hibernate 在 SQL Server 数据库中存储 joda DateTime

java - 解析远程服务器上的日期时间

java - 计算 1918-03-24 之后的天数时,Joda 时间差一错误

java - 强制转换:为什么子类属性在分配给父类(super class)变量时变得不可访问?

java - 在我的 WSL Kali linux 上安装 jdk 时出现语法错误

java - 为什么 Java 将 1h 添加到我的 DateTime 中?