如何在Java8中使⽤LocalDateTime格式化解析⽇期-⽰例教程Java项⽬中的常见任务之⼀是将⽇期格式化或解析为String,反之亦然。 解析⽇期表⽰您有⼀个表⽰⽇期的字符串,例如“ 2017-08-3”,并且要将其转换为表⽰Java中⽇期的对象,例如Java 8之前版本中的java.util.Date以及LocalDate或LocalDatetime在Java 8世界中。 同样,格式化⽇期意味着将⽇期实例转换为String,例如,您有⼀个Date对象或LocalDatetime对象,并且您希望使⽤dd-MM-yyyy 格式的String。
Java 8 API为格式化和解析⽇期提供了很好的⽀持。 例如,如果您有⼀个⽇期为String的⽇期,例如“ 2017-08-3 12:30”,并且想要将其转换为LocalDateTime实例,则该实例是JDK 8 Date and Time API中的新类,并且包含⽇期和时间部分,您该怎么做? 好了,您可以使⽤LocalDateTime类中的format()和parse()⽅法来实现这⼀点,但是还需要⼀件事,即⽇期格式。
在Java 8之前,您可能已经知道我们使⽤SimpleDateFormat和DateFormat类来表⽰⼀种格式,这存在很多问题,例如它们笨重,易变且不是线程安全的,这意味着您⽆法共享它们,并且每次都需要要将String转换为Date,必须创建⼀个新的DateFormat对象。 尽管将SimpleDateFormat封装到线程局部变量中确实可以缓解,但这还不够。
JDK 8在新的DateTimeFormatter类中解决了该问题,该类可⽤于定义⽇期和时间格式,例如“ yyyy-MM-dd HH:mm”,⽤于指定格式的语法与我们之前在SimpleDateFormat类中使⽤的语法相同,但此类既是
线程安全的⼜是不可变的,这意味着您可以在线程之间共享其实例。 理想情况下,您可以将DateTimeFormatter的引⽤存储到静态变量中以使其成为全局变量。
使⽤DateTimeFormatter的另⼀个优点是它提供了⼏个内置的格式化程序,例如
java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME,它可以将⽇期表⽰为
“ 2017-08-03T10:15:30”。 您可以在Javadoc中看到内置格式化程序的完整列表,也可以阅读以获得更多信息。
获得格式化程序后,解析或格式化⽇期就像调⽤⽅法⼀样容易。 您只需要调⽤LocalDateTime.parse()⽅法即可在Java 8中将String转换为LocalDateTime。parse()接受String并根据DateTimeFormatter指定的格式将其解析为LocalDateTime实例。 parse()⽅法也被重载,默认情况下它使⽤ISO_LOCAL_DATE_TIME格式,即“ yyyy-MM-dd HH:mm”,即“ 2017-08-03T10:15:30”,但是如果您的String格式不同,则您可以指定⼀个单独的格式化程序。
因此,⾜够的理论,让我们开始真正的⼯作……
如何使⽤LocalDateTime格式化⽇期
假设您要从数据库或⽂件中以ISO格式(例如“ yyyy-MM-dd HH:mm”)将⽇期作为String加载,并且要将其转换为
java.time.LocalDateTime。 以下是在Java 8中将⽇期字符串解析为LocalDateTime的确切步骤:
1)创建⼀个DateTimeFormatter对象
2)使⽤LocalDateTime.parse(string,formatter)⽅法将String转换为LocalDatetime对象
顺便说⼀句,在我们的情况下,⽇期是ISO格式,您⽆需创建单独的格式化程序,就可以直接调⽤parse⽅法,如以下⽰例所⽰:
String date = "2017-03-08T12:30:54";
LocalDateTime localdatetime = LocalDateTime.parse(date);
System.out.println("origional date as string: " + date);
System.out.println("generated LocalDateTime: " + localdatetime);
Output
origional date as string: 2017-03-08T12:30:54
generated LocalDateTime: 2017-03-08T12:30:54
顺便说⼀句,如果您的⽇期字符串不是parse⽅法期望的ISO格式,例如第⼆部分没有T或缺少分钟,则它将引发DateTimeParseException。 例如,如果要解析“ 2017-08-3 12:30”或“ 2017-03-08 12:30:54”,则它将引发以下异常:
线程“主”中的异常java.time.format.DateTimeParseException:⽆法在
线程“主”中的异常java.time.format.DateTimeParseException:
java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)的索引10处解析⽂本'2017-03-
08T12:30:54'在Demo.main(Demo.java:22)在java.time.LocalDateTime.parse(LocalDateTime.java:492)在
java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
为避免此错误,您可以创建⼀个与您的⽇期字符串匹配的DateTimeFormatter实例。 例如,如果您的⽇期类似于“ 2017-08-3
12:30”,则可以创建⼀个DateTimeFormatter,如下所⽰:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
之后,可以使⽤此格式化程序实例将String解析为LocalDateTime,如以下⽰例所⽰:
String date = "2017-03-08 12:30:54";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(date, format);
System.out.println("origional date as string: " + date);
System.out.println("generated LocalDateTime: " + dateTime);
Output:
origional date as string: 2017-03-08 12:30
generated LocalDateTime: 2017-03-08T12:30
您可以看到没有更多的例外,但是您必须确保⽇期(以字符串形式)必须与您在DateTimeFormatter实例中定义的模式匹配。 由于它也是线程安全且不可变的,因此您甚⾄可以将其存储在静态变量中,并在程序的另⼀部分之间共享。 您可以在上的新⽇期和时间API中阅读有关线程安全性和不变性的更多信息。
书。
如何使⽤LocalDateTime格式化⽇期
在上⼀部分中,您学习了如何解析⽇期,例如,将⽇期的String表⽰形式转换为相应的对象,即Java 8中的LocalDateTime。以“ dd-MM-yyyy”格式显⽰。
同样,我们需要⼀个DateTimeFormatter实例来保存我们的⽇期模式,然后可以使⽤LocalDateTime类的format()⽅法来实现此⽬的。但是,您应该记住format()是⼀个⾮静态⽅法,并且需要LocalDateTime类的实例才能调⽤此⽅法。 以下是在Java 8中使⽤LocalDatetime格式化⽇期的⽰例:
DateTimeFormatter aFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime localDateTime = LocalDateTime.of(2017, Month.AUGUST, 3, 12, 30);
String foramttedString = localDateTime.format(aFormatter); // "2017-03-08 12:30"
System.out.println("origional LocalDatetime object: " + localDateTime);
System.out.println("generated string : " + foramttedString);
Output:
origional LocalDatetime object: 2017-08-03T12:30
generated string : 03-08-2017 12:30
您应该注意到,我们在对象上⽽不是在类上调⽤format⽅法,因为它是⼀个⾮静态⽅法,与parse()相反,后者是静态⽅法。 您还可以看到⽣成的字符串确认您的模式,即“ 03-08-2017 12:30”为“ dd-MM-yyyy HH:mm”格式。
Java程序在JDK 8中使⽤LocalDateTime格式化/解析⽇期
这是我们的⽰例Java程序,它使⽤Java 8中的LocalDateTime封装了解析和格式化⽇期的⽰例。
import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
/*
* Java Program to parse to LocalDateTime in JDK 8.
* We'll convert a String "2017-03-08 12:30" into LocalDateTime.
* we'll also see how to format a LocalDateTime instance to String format.
*/
public class Demo {
public static void main(String[] args) throws Exception {
// parsing a string date to LocalDateTime
String date = "2017-03-08 12:30";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(date, format);
System.out.println("origional date as string: " + date);
System.out.println("generated LocalDateTime: " + dateTime);
//formatting a LocalDateTime to string instance
DateTimeFormatter aFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localDateTime = LocalDateTime.of(2017, Month.AUGUST, 3, 12, 30);
String foramttedString = localDateTime.format(aFormatter); // "2017-03-08 12:30"
System.out.println("origional LocalDatetime object: " + localDateTime);
System.out.println("generated string : " + foramttedString);
// be careful, string must contain date and time portion
/
/ if you are converting to LocalDateTime, or else, your
// code will break
LocalDateTime dateWithoutTime = LocalDateTime.parse("2017-08-03", format);
}
}
Output
origional date as string: 2017-03-08 12:30
generated LocalDateTime: 2017-03-08T12:30
origional LocalDatetime object: 2017-08-03T12:30
generated string : 2017-08-03 12:30
Exception in thread "main" java.time.format.DateTimeParseException:
Text '2017-08-03' could not be parsed at index 10
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at Demo.main(Demo.java:35)
重要事项
1)LocalDateTime.parse()⽅法⽤于解析,它是⼀个静态⽅法,但是format()⽅法不是静态的,并且需要LocalDateTime实例来调⽤。 这是parse()和format()⽅法之间需要注意的重要区别。 例如,LocalDateTime.format(DateTimeFromatter)在Java中是⾮法的,并且会给出编译时错误。
2)您必须确保您的String确认您⽤于解析和格式化的格式,如果没有,则parse()和format()⽅法都将引发
“线程“ main” java.time中的异常” .format.DateTimeParseException:⽆法在索引10 DateTimeParseEx
ception,例如“线程“ main” java.time中的异常” .format.DateTimeParseException:⽂本'2017-08-03' 。
''''处解析⽂本'2017-08-03'
3)Java 8提供了⼏种内置格式,如果它达到了⽬的,那么应该使⽤相同的格式,⽽不是创建⼀个新格式。
4)由于DateTimeFormatter既是不可变的,也是线程安全的,因此建议将其存储在静态变量中,并在想要使⽤的任何⼈之间共享,但请确保该变量既是静态变量⼜是final变量,以便线程可以读取它但不能分配新的对其进⾏引⽤或为null,这可能会导致细微的问题。 有关更多详细信息,请参阅我的⽂章有关在多线程环境中使⽤静态变量的危险。
以下是在Java 8中⽤于将⽇期格式化或解析为LocalDateTime的代码的摘要:
Java 8中如何使⽤LocalDateTime格式化和解析⽇期的全部内容。 就像我说的那样,每个新类(例如LocalDate,LocalTime 这就是Java 8中如何使⽤LocalDateTime格式化和解析⽇期
和LocalDateTime)都具有解析和格式化⽅法,该⽅法可⽤于将字符串转换为⽇期,反之亦然。 请记住,您需要⼀个DateTimeFormatter,其模式必须与您的⽇期字符串匹配,如果不匹配,则两个parse
()⽅法都将引发
java.time.format.DateTimeParseException错误。
您还应该记住parse()和format()⽅法之间的区别,前者是静态的,⽽后者是⾮静态的。 您要记住的另⼀件事是以静态变量的形式或利⽤JDK中提供的⼏种内置格式器来重⽤DateTimeFormatter实例。 您可以进⼀步阅读以了解有关Java 8的新功能的更多信息,包括新的Date and Time API。
Java 8⽇期和时间教程 :
您可能想探索的其他Java 8⽇期和时间教程
如何在Java中⽐较两个⽇期? ( )
如何在Java中获取当前的时间戳值? ( )
如何在Java 8中将String转换为LocalDateTime? ( ) 如何在JDBC中将java.util.Date转换为java.sql.Timestamp? ( ) 如何在Java 8中将Date转换为LocalDateTime? ( ) 如何在Java 6中获取当前⽇期和时间? ( ) 如何使⽤JodaTime库将String解析为Date? () 如何在JDBC中将java.util.Date转换为java.sql.Date? ( ) 如何在Java 8中将String转换为LocalDateTime( )
jdk怎么使用感谢您到⽬前为⽌阅读本⽂。 如果您喜欢Java 8⽇期和时间教程以及我的提⽰,请与您的朋友和同事分享。 如果您有任何问题或反馈,请发表评论。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论