问题描述
我正在尝试将代码从Java 8迁移到OpenJDK11。在尝试解析日期字符串之前,一切都进行得很顺利。我有很多来自数据库的日期字符串(不是,我不能更改数据库),这些字符串在Java 7中解析正常,但在Java 11中失败。
一些注意事项:
- 语言环境设置为相同的默认值。
- 该日期最初是使用具有LONG,LONG设置的日期格式生成的。
- 我在Java 8上运行此程序以节省时间。然后在Java 11上,我将以毫秒为单位的时间转换为日期。似乎工作正常。
- 但是,系统似乎在日期和时间之间插入了一个“ at”。
- 我试图在日期中添加“ 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 desugaring和How 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);
}
}