我已经对此做了一些阅读,并try 完成其他StackOverflow线程中的示例,但如果我试图指定可选部分,则在解析日期/时间时总是遇到异常.

这是输入.可选部分是AM/PM和时区,AM/PM可能不总是在输入中,时区可能是4个字符:

09:10:05.584 AM EST Wed Nov 29 2023

这是适用于此输入的模式,但不适用于其他输入,例如如果没有时区

hh:mm:ss.SSS a zzz E MMM dd yyyy

如果我try 这样做并创建可选模式,我会在输入中的位置12处获得一个解析异常,该位置正好在毫秒之后

hh:mm:ss.SSS[ a [z]zzz ]E MMM dd yyyy

以下是代码,当前设置为失败的格式:


public static final String TIME_FORMAT = "hh:mm:ss.SSS[ a [z]zzz ]E MMM dd yyyy";


public static String ParseDate(String input, String format) {
        
        
        String retVal = "";
        
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format, Locale.ENGLISH);
        
        TemporalAccessor ta = formatter.parseBest(input, LocalDateTime::from, LocalDate::from);
        
        retVal = ta.toString();
       
        System.out.println("Parsed date is: "+ retVal);
        return retVal;
    }

推荐答案

这是一个棘手的问题,因为DateTimeFormatter类的可选部分的语法特别希望在方括号中包含可选元素和前一个元素之间的空格.

parseBest()方法的文档显示了一个具有可选时区ID uuuu-MM-dd HH.mm[ VV]的模式示例,其中分钟和时区ID之间的空格包含在可选部分中.

在您的代码片段中,第一个可选部分正确地写成了hh:mm:ss.SSS[ a...(方括号中包含了SSSa之间的空格),但随后时区名称的可选部分写成了a [z]zzz而不是a[ z]zzz.在您的例子中,您可以像SOhh:mm:ss.SSS[[ a] zzz] E MMM dd yyyy一样嵌套可选部分,也可以将它们编写为单独的可选部分hh:mm:ss.SSS[ a][ z][ zzz] E MMM dd yyyy.

以下是您的代码的重写版本,涵盖了这4种情况:

public class Main {
    public static void main(String[] args) {
        parseDate("09:10:05.584 AM EST Wed Nov 29 2023", TIME_FORMAT);
        parseDate("09:10:05.584 AM Wed Nov 29 2023", TIME_FORMAT);
        parseDate("09:10:05.584 EST Wed Nov 29 2023", TIME_FORMAT);
        parseDate("09:10:05.584 Wed Nov 29 2023", TIME_FORMAT);
    }
    public static final String TIME_FORMAT = "HH:mm:ss.SSS[ a][ z][zzz] E MMM dd yyyy";

    public static String parseDate(String input, String format) {
        String retVal = "";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format, Locale.ENGLISH);
        TemporalAccessor ta = formatter.parseBest(input, LocalDateTime::from, LocalDate::from);
        retVal = ta.toString();
        System.out.println("Parsed date is: " + retVal);
        return retVal;
    }
}

您可以通过以下链接快速查看代码:

https://ideone.com/bpfw8o

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

在Java 8之后,HashMap的最坏情况下时间复杂度仍然是O(n)而不是O(log n)?

如何使用Java API在Oracle ODI中运行模拟?

了解Android Studio中的调试器输出

CAMEL 4中的SAXParseException

在bash中将数组作为Java程序的参数传递

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

Sack()步骤中的合并运算符未按预期工作

try 在Android Studio中的infoWindow中使用EditText(Java)

支持MySQL 5.6的最新Hibernate版本

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

找出承载Cargo 的最小成本

多线程、并发和睡眠未按预期工作

获取月份';s在java中非UTC时区的开始时间和结束时间

如何从指定某些字段的父对象创建子对象

如何在Java上为循环数组从synchronized迁移到ReentrantLock

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?

Vaadin Flow:设置密码显示按钮属性