DateTime 类的 parse 方法中格式化程序的样式必须与字符串的确切样式匹配吗?例如,我从数据库 (Oracle) 获取一个 TimeStamp 对象并将其转换为字符串。在数据库中,时间戳是这样存储的
2012 年 8 月 8 日 12.00.00.000000000 上午
我将格式化程序设置为这种样式
String pattern = "dd-MMM-yy";
我遇到了这个异常
java.lang.IllegalArgumentException: Invalid format: "08-AUG-12 12.00.00 AM" is malformed at " 12.00.00 AM"
org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
org.joda.time.DateTime.parse(DateTime.java:144)
这到底意味着什么以及我将如何解决它?当我将格式化程序设置为
"yy-MMM-dd hh.mm.ss aa"
时,我没有遇到异常,但它在浏览器中打印如下:2008-08-12T00:00:00.000-04:00
,但我需要将其打印为 "dd-MMM-yy hh:mm:ss aa"
使用 LocalDateTime 代替:
String input = "08-AUG-12 12.00.00 AM";
String pattern = "dd-MMM-yy hh.mm.ss aa";
LocalDateTime localDateTime = LocalDateTime.parse(input, DateTimeFormat.forPattern(pattern));
编辑
事实上,您也可以使用 DateTime 来做到这一点:
private static String parseDateTime(String input){
String pattern = "dd-MMM-yy hh.mm.ss aa";
DateTime dateTime = DateTime.parse(input, DateTimeFormat.forPattern(pattern));
return dateTime.toString("dd-MMM-yy hh:mm:ss aa");
}
想通了。要获得正确的格式,您必须调用 formatter.print(localDateTime object) 并且它有效。
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的旧版java.util
日期时间 API。任何新代码都应使用 java.time
API*。
另外,下面是Joda-Time主页上的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到
(JSR-310) - JDK 的核心部分,它取代了这个 项目。java.time
DateTime 的 parse 方法中格式化程序的样式是否 类必须与字符串的确切样式匹配?
大部分是“是”。但是,也有一些例外,例如单个
u
可以解析 4 位数的年份,单个 M
可以解析一位/两位数的月份,单个 d
可以解析一位/两位数的月份等。 LocalDate.parse("15/10/2024", DateTimeFormatter.ofPattern("d/M/u"))
。我建议您阅读DateTimeFormatter
文档以了解更多信息。
在数据库中,时间戳是这样存储的
2012 年 8 月 8 日 12.00.00.000000000 上午
我建议您构建一个不区分大小写的
DateTimeFormatter
来处理 AUG/Aug、AM/am 等情况。下面的演示展示了如何创建这样的 DateTimeFormatter
。
此外,只要您正在解析的日期时间字符串包含字母(例如 AUG、AM 等),请使用适当的
Locale
,因为它们对 Locale
敏感。您可能想检查始终指定带有 Locale
的 SimpleDateFormat
,以及自定义格式的 DateTimeFormatter
。
演示:
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd-MMM-uu hh.mm.ss.SSSSSSSSS a")
.toFormatter(Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse("08-AUG-12 12.00.00.000000000 AM", dtf);
System.out.println(ldt);
}
}
输出:
2012-08-08T00:00
从 Trail:日期时间了解有关现代日期时间 API 的更多信息。