Java 11OpenJDK 11不可解析的日期

问题描述

我正在尝试将代码从Java 8迁移到OpenJDK11。在尝试解析日期字符串之前,一切都进行得很顺利。我有很多来自数据库的日期字符串(不是,我不能更改数据库),这些字符串在Java 7中解析正常,但在Java 11中失败。

一些注意事项:

  1. 语言环境设置为相同的认值。
  2. 该日期最初是使用具有LONG,LONG设置的日期格式生成的。
  3. 我在Java 8上运行此程序以节省时间。然后在Java 11上,我将以毫秒为单位的时间转换为日期。似乎工作正常。
  4. 但是,系统似乎在日期和时间之间插入了一个“ at”。
  5. 我试图在日期中添加“ at”文本,但仍然失败。

有人可以指出我正确的方向吗?我最终需要对这些字符串进行日期计算。

谢谢!

布鲁斯

'$'

解决方法

根据文档https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/DateFormat.html,您似乎需要完整格式

knownclientapplications

如果可以的话,在解析方法中(在第395行附近)在DateFormat.java上放置一个断点,以了解发生了什么。

,

一个安全的选择是将MDT替换为相应的时区说明符Mountain Standard Time

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "September 1,2015 3:13:29 AM MDT".replace("MDT","Mountain Standard Time");
        ZonedDateTime zdt = ZonedDateTime.parse(dateTimeStr,DateTimeFormatter.ofPattern("MMMM d,u h:m:s a zzzz",Locale.ENGLISH));
        System.out.println(zdt);

        // Custom format
        String formatted = zdt.format(DateTimeFormatter.ofPattern("EEEE MMMM dd uuuu 'at' hh:mm:ss a",Locale.ENGLISH));
        System.out.println(formatted);
    }
}

输出:

2015-09-01T03:13:29-06:00[America/Denver]
Tuesday September 01 2015 at 03:13:29 AM

注意:旧式java.util日期时间类已过时且容易出错,其格式化API SimpleDateFormat也是如此。我建议您应该完全停止使用它们,并切换到modern date-time API。在 Trail: Date Time 上了解有关现代日期时间API的更多信息。

如果您正在为自己的Android项目执行此操作,并且您的Android API级别仍不符合Java-8,请选中Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

使用旧版API:

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

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "September 1,"Mountain Standard Time");
        Date date = new SimpleDateFormat("MMMM d,yyyy h:m:s a zzzz",Locale.ENGLISH).parse(dateTimeStr);
        System.out.println(date);

        // Custom format
        String formatted = new SimpleDateFormat("EEEE MMMM dd yyyy 'at' hh:mm:ss a",Locale.ENGLISH).format(date);
        System.out.println(formatted);
    }
}