解析字符串日期无法解析的日期java

57hvy0tb  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(183)

我正在尝试解析一个String date,如下所示:Mon Dec 28 15:18:16 2021转换成这样的东西:yyyy-MM-dd HH:mm:ss z这是我的代码

public void parseDate(String stringDate) throws ParseException {
    SimpleDateFormat formatRecived = new SimpleDateFormat("Www Mmm dd HH:mm:ss YYYY");
    try{
        Date date = formatRecived.parse(stringDate);
        System.out.println(date);
    }catch (ParseException parseException){
        System.out.println(parseException.getMessage());
    }

}

我的异常消息是Unparseable date: "Mon Dec 28 15:18:16 2021"
你能帮我吗?

xdnvmnnf

xdnvmnnf1#

tl;dr

LocalDateTime
        .parse(
                "Tue Dec 28 15:18:16 2021" ,      // Tuesday, not Monday.
                DateTimeFormatter
                        .ofPattern( "EEE MMM dd HH:mm:ss uuuu" )
                        .withLocale( Locale.US )  // Critical to parsing name of month, day of week, etc.
        )                                         // Returns a `LocalDateTime` object.
        .toString()                               // Returns a `String`, with text in standard ISO 8601 format.
        .replace( "T" , " " )                     // Returns another `String` object.

2021-12-28 15:18:16

数据错误

开始,你的输入数据是有缺陷的。2021-12-28是星期二,而不是星期一。所以你的输入示例应该是:

String input = "Tue Dec 28 15:18:16 2021";

避免使用遗留的日期时间类

您正在使用有严重缺陷的日期-时间类,这些类在几年前就被JSR 310中定义的现代 java.time 类所取代。

定义格式化模式

让我们编写一个与输入匹配的格式模式。

DateTimeFormatter f =
        DateTimeFormatter
                .ofPattern( "EEE MMM dd HH:mm:ss uuuu" )
                .withLocale( Locale.US );

LocalDateTime

然后解析为一个LocalDateTime。这个类表示一个带有时间的日期,但缺少时区或UTC偏移量的上下文。

LocalDateTime ldt = LocalDateTime.parse( input , f );

解分区转分区?

你的输入字符串没有时区或偏移量,但你希望在输出中有一个,在输出中你指定了z
这是没有意义的。您必须为输入数据指定一个时区(或偏移量)。但您提供的信息不足以实现这一点。
您可以将ZoneId应用于LocalDateTime以获得ZonedDateTime。通过提取Instant来调整到UTC。

ISO 8601

否则,所需的输出文本的格式类似于LocalDateTime#toString中默认使用的标准ISO 8601格式。
2021-12-28T15:18:16
您可以通过简单的文本操作将中间的T替换为SPACE(或者您可以定义另一种自定义格式模式)。

String output = ldt.toString().replace( "T" , " " ) ;
zpgglvta

zpgglvta2#

试试下面的代码-

public void parseDate(String stringDate) throws ParseException {
    SimpleDateFormat formatRecived = new SimpleDateFormat("E MMM dd HH:mm:ss yyyy");
    try{
        Date date = (Date)formatRecived.parse(stringDate);
        System.out.println(date);
        SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        String finalString = newFormat.format(date);
        System.out.println(finalString);
    }catch (ParseException parseException){
        System.out.println(parseException.getMessage());
    }

}

我把“WWW”改成了“E”,把“YYYY”改成了“YYYY”。

相关问题