Java 11(OpenJDK 11)不可解析的日期

Java 11(OpenJDK 11)不可解析的日期,java,date,datetime,timezone,datetime-format,Java,Date,Datetime,Timezone,Datetime Format,我正在尝试将代码从Java8迁移到OpenJDK11。在我尝试解析日期字符串之前,一切都进行得非常顺利。我有大量来自数据库的日期字符串(不,我不能更改数据库),它们在Java7中解析得很好,但在Java11中解析失败 一些注意事项: 区域设置设置为相同的默认值 日期最初是使用具有长、长设置的日期格式化程序生成的 我在Java8上运行这个程序是为了在mills中获得时间。然后在Java11上,我将mills中的时间转换为日期。这似乎很管用 然而,系统似乎在日期和时间之间插入了一个“at” 我试图在

我正在尝试将代码从Java8迁移到OpenJDK11。在我尝试解析日期字符串之前,一切都进行得非常顺利。我有大量来自数据库的日期字符串(不,我不能更改数据库),它们在Java7中解析得很好,但在Java11中解析失败

一些注意事项:

  • 区域设置设置为相同的默认值
  • 日期最初是使用具有长、长设置的日期格式化程序生成的
  • 我在Java8上运行这个程序是为了在mills中获得时间。然后在Java11上,我将mills中的时间转换为日期。这似乎很管用
  • 然而,系统似乎在日期和时间之间插入了一个“at”
  • 我试图在日期中添加“at”文本,但仍然失败
  • 有人能给我指出正确的方向吗?我最终需要对这些字符串进行日期计算

    谢谢

    布鲁斯


    根据文档,您似乎需要完整的格式

    LONG is longer, such as January 12, 1952 or 3:30:32pm
    FULL is pretty completely specified, such as Tuesday, April 12, 1952 AD or 3:30:42pm PST.
    

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

    一个安全的选项是替换为相应的时区说明符,
    山标准时间

    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
    
    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, 2015 3:13:29 AM MDT".replace("MDT", "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);
        }
    }
    
    注意:传统的
    java.util
    date-time类已经过时且容易出错,它们的格式化API
    SimpleDataFormat
    也是如此。我建议你完全停止使用它们,转而使用。有关现代日期时间API的更多信息,请访问

    如果您是为您的Android项目执行此操作,并且您的Android API级别仍然不符合Java-8,请检查并重试

    使用传统API:

    2015-09-01T03:13:29-06:00[America/Denver]
    Tuesday September 01 2015 at 03:13:29 AM
    
    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, 2015 3:13:29 AM MDT".replace("MDT", "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);
        }
    }
    

    有一个兼容性标志:它是哪个默认语言环境?英国,美国,新西兰英语…?询问的部分原因是提到的三个地区在格式化和解析date和times.Ops时表现不同。很抱歉作为一个快速测试,我将格式设置为FULL-FULL(以及几乎所有的组合)。仍然有不可解析的日期例外。看来我得深入调查消息来源,看看发生了什么。我们试图避免这种情况……好吧,有一个局部解决方案:添加JRE选项-Djava.locale.providers=COMPAT,并保持格式很长很长。有趣。不确定这对我的情况来说是一个完全可行的解决方案,但至少它将实际解析日期!Jihed,谢谢你给我指明了正确的方向!不客气,布鲁斯!