理解 JodaTime DateTime.parse(string, formatter)

问题描述 投票:0回答:3

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"

java datetime formatting jodatime
3个回答
54
投票

使用 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");
}

2
投票

想通了。要获得正确的格式,您必须调用 formatter.print(localDateTime object) 并且它有效。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API*

另外,下面是Joda-Time主页上的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到

java.time
(JSR-310) - JDK 的核心部分,它取代了这个 项目。

使用现代日期时间 API 的解决方案

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 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.