微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 将SimpleDateFormat转换为DateTimeFormatter

因此,当尝试使用SimpleDateFormat和Date替换一些遗留代码时,要使用 java.time.DateTimeFormatter和LocalDate,我遇到了问题.两种日期格式不相同.在这一点上,我必须说我知道两种日期类型不一样,但我所处的场景意味着我从不关心时间方面,所以可以忽略它.
public Date getDate(String value) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    try {
        return dateFormat.parse(value);
    } catch (ParseException e) {
        return null;
    }
}

public LocalDate getLocalDate(String value) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    try {
        return LocalDate.parse(value,formatter);
    } catch (DateTimeParseException e) {
        return null;
    }
}

public void testDates() {
    getDate("03/07/2016");               // Sun Jul 03 00:00:00 BST 2016
    getDate("3/7/2016");                 // Sun Jul 03 00:00:00 BST 2016
    getDate("3/7/2016 00:00:00");        // Sun Jul 03 00:00:00 BST 2016
    getDate("3/7/2016 00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016
    getDate("3/7/2016T00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016

    getLocalDate("03/07/2016");               // 2016-07-03
    getLocalDate("3/7/2016");                 // null
    getLocalDate("3/7/2016 00:00:00");        // null
    getLocalDate("3/7/2016 00:00:00.0+0100"); // null
    getLocalDate("3/7/2016T00:00:00.0+0100"); // null
}

正如您所看到的,当两个格式化程序中使用相同的模式时,DateTimeFormatter最终会生成空值,您希望看到的日期等同于SDF的日期.在这种情况下,我希望丢弃不需要的数据,但事实并非如此.

那么,我们如何创建一个强大的日期/时间解析器?!

解决方法

所以可能还有其他答案,但我提出的方法是迎合我最极端的情况.首先,我将dd / MM降低到d / M.这表示预期字符的最小数量,因此将完全解析两位数.请注意,您也可以使用新的DateTimeFormatterBuilder().parseLenient(),但这似乎是不必要的.

其次,我决定在格式模式本身中使用可选子句.这允许您指定可能不提供哪些部分,这正是我试图解决的情况.

离开我们:

DateTimeFormatter.ofPattern("d/M/yyyy[' ']['T'][H:mm[:ss[.S]]][X]");

现在,这将处理提供有或没有时间的日期,包括T分隔符,秒,毫秒和区域偏移.

运气好,这有助于其他人!

private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy[' ']['T'][H:mm[:ss[.S]]][X]");

public LocalDate getRobustLocalDate(String value) {
    try {
        return LocalDate.parse(value,formatter);
    } catch (DateTimeParseException e) {
        return null;
    }
}

@Test
public void testDates() {
    getRobustLocalDate("03/07/2016");               // 2016-07-03
    getRobustLocalDate("3/7/2016");                 // 2016-07-03
    getRobustLocalDate("3/7/2016 00:00:00");        // 2016-07-03
    getRobustLocalDate("3/7/2016 00:00:00.0+0100"); // 2016-07-03
    getRobustLocalDate("3/7/2016T00:00:00.0+0100"); // 2016-07-03
}

原文地址:https://www.jb51.cc/java/128831.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐