Java 如何使用LocalDateTime解析/格式化日期?(爪哇8)

Java 如何使用LocalDateTime解析/格式化日期?(爪哇8),java,datetime,java-8,timestamp,java-time,Java,Datetime,Java 8,Timestamp,Java Time,Java8添加了一个用于处理日期和时间的新API() 我将日期和时间作为字符串(例如“2014-04-08 12:30”)。如何从给定字符串中获取实例 使用完LocalDateTime对象后:如何将LocalDateTime实例转换回如上所示格式的字符串?解析日期和时间 String iso8601 = "2016-02-14T18:32:04.150Z"; ZonedDateTime zdt = ZonedDateTime.parse(iso8601); LocalDateTime ldt =

Java8添加了一个用于处理日期和时间的新API()

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


使用完
LocalDateTime
对象后:如何将
LocalDateTime
实例转换回如上所示格式的字符串?

解析日期和时间

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();
要从字符串创建
LocalDateTime
对象,可以使用静态方法。它接受一个字符串和一个参数。
DateTimeFormatter
用于指定日期/时间模式

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
格式化日期和时间

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();
要创建格式化字符串并输出
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.ISO\u DATE\u TIME
格式化
LocalDateTime
实例将导致字符串
“1986-04-08T12:30:00”


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

您也可以在
字符串上使用
LocalDate.parse()
LocalDateTime.parse()
,而不提供模式,如果
字符串
在中

比如说,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);
输出

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30
只有在必须处理其他日期模式时,才使用
DateTimeFormatter

例如,在以下示例中,dd MMM uuuu表示月份的日期(两位数)、月份名称的三个字母(一月、二月、三月……)和四位数的年份:

DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
String anotherDate = "04 Aug 2015";
LocalDate lds = LocalDate.parse(anotherDate, dTF);
System.out.println(anotherDate + " parses to " + lds);
输出

04 Aug 2015 parses to 2015-08-04
2015-08-04 formats as 04 Aug 2015
还要记住,
DateTimeFormatter
对象是双向的;它既可以解析输入,也可以格式化输出

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
System.out.println(aLD + " formats as " + dTF.format(aLD));
输出

04 Aug 2015 parses to 2015-08-04
2015-08-04 formats as 04 Aug 2015
(见全文)

符号含义表示示例
------  -------                     ------------      -------
G时代文本广告;阿诺·多米尼;A.
u 2004年;04
y纪年2004年;04
D年号189
M/L年度月份编号/文本7;07; 7月;七月,;J
d第10个月的第几天
季度数/季度数/文本3;03; 第三季度;第三季度
以Y周为基础的1996年;96
w基于第27年的每周
W第4个月的第几周
E星期二的星期二文本;星期二;T
e/c本地化周数/文本2;02; 星期二;星期二;T
F第3个月的第几周
每日上午一点下午一点
小时:上午12点(1-12)12号
上午九时至下午五时(0-11)第0
下午1-24时00分第0号
小时数(0-23)0
m小时分钟数30
第55分钟第二秒
第二分式的S分式978
百万日数1234
第二个号码为987654321的n nano
N第1234000000天的nano
V时区ID美国/洛杉矶;Z-08:30
z时区名称时区名称太平洋标准时间;PST
O局部区域偏移量-O GMT+8;格林尼治时间+08:00;UTC-08:00;
X区偏移“Z”表示零偏移-X Z-08; -0830; -08:30; -083015; -08:30:15;
x区偏移量-x+0000-08; -0830; -08:30; -083015; -08:30:15;
Z区偏移量-Z+0000-0800; -08:00;
p下一个焊盘修改器1
'文本分隔符的转义
“”单引号文字'
[可选部分开始]
]可选部分结束
#留作将来使用
{保留供将来使用
}留作将来使用

以上两个答案都很好地解释了有关字符串模式的问题。但是,如果您正在使用,则无需应用
DateTimeFormatter
,因为LocalDateTime已经准备好了:

将LocalDateTime转换为时区ISO8601字符串

LocalDateTime ldt = LocalDateTime.now(); 
ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); //you might use a different zone
String iso8601 = zdt.toString();
从ISO8601字符串转换回LocalDateTime

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();

将带有日期和时间的字符串解析为特定的时间点(Java称之为“”)相当复杂。Java已经在几次迭代中解决了这个问题。最新的一款,
java.time
java.time.chrono
,涵盖了几乎所有的需求(除了:)

然而,这种复杂性带来了很多困惑

理解日期解析的关键是:

为什么Java有这么多解析日期的方法
  • 有几种测量时间的系统。例如,历史上的日本历法是根据各自皇帝或王朝统治的时间范围衍生出来的。然后是UNIX时间戳。 幸运的是,整个(商业)世界都设法使用同样的方法
  • 从历史上看,系统从/切换到,例如。例如1582年从儒略历到公历。因此,在此之前的“西方”日期需要区别对待
  • A
    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);
    
    // Current UTC time
            OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
    
            // GET LocalDateTime 
            LocalDateTime localDateTime = utc.toLocalDateTime();
            System.out.println("*************" + localDateTime);
    
            // formated UTC time
            DateTimeFormatter dTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
            System.out.println(" formats as " + dTF.format(localDateTime));
    
            //GET UTC time for current date
            Date now= new Date();
            LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
            DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
            System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));
    
    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)
    
    final String date = dt.format(formatter)
    
       Symbol  Meaning                     Presentation      Examples
       ------  -------                     ------------      -------
       V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
       z       time-zone name              zone-name         Pacific Standard Time; PST
       O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
       X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
       x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
       Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
    
    String s = "20210223";
            
    // ok
    LocalDate.parse(s, DateTimeFormatter.ofPattern("uuuuMMdd"));
            
    // java.time.format.DateTimeParseException
    LocalDateTime.parse(s, DateTimeFormatter.ofPattern("uuuuMMdd"));