如何在 java 之间用 T 参数格式化日期?

How to format date with T parameter in between in java?

我有一个这种格式的日期 - 01 May 2020,我想用以下格式解析它 - 2020-05-01T00:00:00。我正在使用以下代码 -

static String convertDateStringFormat(String dateString, String originalDateFormat, String outputDateFormat){
        DateFormat inputFormat = new SimpleDateFormat(originalDateFormat, Locale.ENGLISH);
        Date input = null;
        try {
            input = inputFormat.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        DateFormat outputFormat = new SimpleDateFormat(outputDateFormat, Locale.ENGLISH);
        return outputFormat.format(input);
    }

我将参数传递为 - convertDateStringFormat("01 May 2020", "dd MMM yyyy", "yyyy-MM-dd'T'HH:mm:ss")。我不知道我做错了什么,但它给了我这个异常 - java.lang.IllegalArgumentException: Parse error: 2020-05-01T00:00:00,所以看起来它正在转换为正确的格式然后抛出异常?

使用DateTimeFormatterBuilder构建格式,hour默认为0,然后将日期字符串解析为LocalDateTime

演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter format = new DateTimeFormatterBuilder()
                                    .append(DateTimeFormatter.ofPattern("dd MMM yyyy"))
                                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                    .toFormatter();

        String strDate = "01 May 2020";
        LocalDateTime date = LocalDateTime.parse(strDate, format);

        DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        String strDateInTargetFormat = date.format(targetFormat);

        System.out.println(strDateInTargetFormat);
    }
}

输出:

2020-05-01T00:00:00

像这样将一种格式转换为另一种格式:

DateFormat originalFormat = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = originalFormat.parse("01 May 2020");
String formattedDate = targetFormat.format(date); 

tl;博士

LocalDate
.parse( 
    "01 May 2020" , 
    DateTimeFormatter
    .ofPattern( "dd MMMM uuuu" )
    .withLocale( Locale.US ) 
)
.atStartOfDay(
    ZoneId.of( "Africa/Tunis" )
)
.format(
    DateTimeFormatter.ISO_LOCAL_DATE_TIME
)

看到这个 code run live at IdeOne.com

2020-05-01T00:00:00

详情

你说:

I have a date in this format - 01 May 2020

这意味着您有文字,String不是日期。日期时间对象没有“格式”。

将您的文本解析为 LocalDate

String input = "01 May 2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMMM uuuu" ).withLocale( Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

你说:

want to parse it in the following format - 2020-05-01T00:00:00.

不,那不是解析。即生成文本

但首先我们需要确定一天中的时间。我想你想要一天的第一刻。

某些时区的某些日期并非从 00:00 开始。所以总是让 java.time 确定一天的第一个时刻。我们将这一刻捕捉为 ZonedDateTime 对象。

ZoneId z = ZoneId.of( "Asia/Amman" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

您要求以不指示时区或与 UTC 的偏移量的格式生成文本。我建议不要这样做,因为这样的文本的阅读是模棱两可的。但如果你坚持,java.time 包含预定义的 format for the kind of text you desire. This format is amongst those defined in ISO 8601.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) ;

看到这个 code run live at IdeOne.com

output: 2020-05-01T00:00:00


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time

在哪里获取java.time类?