Java 8增加了一个新的Java。时间API,用于处理日期和时间(JSR 310)。

我将日期和时间作为字符串(例如,“2014-04-08 12:30”)。如何从给定的字符串获得LocalDateTime实例?

在我完成与LocalDateTime对象的工作后:然后如何将LocalDateTime实例转换回与上面所示的相同格式的字符串?


当前回答

解析日期和时间

要从字符串创建LocalDateTime对象,可以使用静态的LocalDateTime.parse()方法。它接受一个字符串和一个DateTimeFormatter作为参数。DateTimeFormatter用于指定日期/时间模式。

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);

格式化日期和时间

要从LocalDateTime对象中创建格式化字符串,可以使用format()方法。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"

注意,在DateTimeFormatter中有一些常用的日期/时间格式预定义为常量。例如:使用DateTimeFormatter。从上面格式化LocalDateTime实例的ISO_DATE_TIME将导致字符串“1986-04-08T12:30:00”。

parse()和format()方法可用于所有与日期/时间相关的对象(例如LocalDate或ZonedDateTime)

其他回答

通用方法如下所示。它适用于:

yyyy-MM-dd HH: mm: ss。瑞士 yyyy-MM-dd HH: mm: ss。年代 yyyy-MM-dd HH: mm: ss yyyy-MM-dd HH: mm yyyy-MM-dd HH yyyy-MM-dd public static final String DATE_FORMAT_YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; stringtollocaldatetime (String s){ LocalDateTime返回。解析(年代,DateTimeFormatter.ofPattern (DATE_FORMAT_YYYY_MM_DD_HH_MM_SS_SSS。substring (0, s.length ()))); }

关于LocalDateTime还有一点需要注意。解析的一个缺点是,您不能将它与只有日期格式化程序字符的自定义格式化程序一起使用,例如uuuuMMdd。在本例中,您应该使用LocalDate。解析。例如:

String s = "20210223";
        
// ok
LocalDate.parse(s, DateTimeFormatter.ofPattern("uuuuMMdd"));
        
// java.time.format.DateTimeParseException
LocalDateTime.parse(s, DateTimeFormatter.ofPattern("uuuuMMdd")); 

让我们回答两个问题,示例字符串“2014-04-08 12:30”

如何从给定的字符串获得LocalDateTime实例?

import java.time.format.DateTimeFormatter
import java.time.LocalDateTime

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")

// Parsing or conversion
final LocalDateTime dt = LocalDateTime.parse("2014-04-08 12:30", formatter)

Dt应该允许您执行所有与日期时间相关的操作

然后如何将LocalDateTime实例转换回具有相同格式的字符串?

final String date = dt.format(formatter) 

我发现像这样涵盖日期时间格式的多种变体非常棒:

final DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0);

对于这个问题,已经有很多好的答案。这个回答展示了如何使用预定义的DateTimeFormatter来构建一个DateTimeFormatter,它可以解析给定的日期-时间字符串。

但是,使用此DateTimeFormatter格式化获得的LocalDateTime将返回一个HH:mm:ss格式的时间字符串。为了将时间字符串限制为HH:mm格式,我们仍然必须使用模式uuuu-MM-dd HH:mm,就像其他答案所做的那样。

演示:

class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .append(DateTimeFormatter.ISO_LOCAL_TIME)
                .toFormatter(Locale.ENGLISH);

        String strDateTime = "2014-04-08 12:30";
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
        System.out.println(ldt);

        // However, formatting the obtained LocalDateTime using this DateTimeFormatter
        // will return a string with time in HH:mm:ss format. To restrict the time
        // string to HH:mm format, we still have to use the pattern, uuuu-MM-dd HH:mm as
        // other answers have done.
        String strDateTimeFormatted = ldt.format(dtf);
        System.out.println(strDateTimeFormatted);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm", Locale.ENGLISH);
        strDateTimeFormatted = ldt.format(formatter);
        System.out.println(strDateTimeFormatted);
    }
}

输出:

2014-04-08T12:30
2014-04-08 12:30:00
2014-04-08 12:30

在线演示

注意:在这里,你可以用y代替u,但我更喜欢u而不是y。

从Trail: Date Time了解更多关于现代Date-Time API的信息。