如何在Java 8中使用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中看到内置格式化程序的完整列表,也可以阅读Really In耐心的Java SE 8以获得更多信息。

获得格式化程序后,解析或格式化日期就像调用方法一样容易。 您只需要调用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.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中阅读有关线程安全性和不变性的更多信息。
Java SE 8,用于“真正不耐烦”的书。

如何使用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 breakLocalDateTime 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()方法都将引发DateTimeParseException,例如“线程“ main” java.time中的异常” .format.DateTimeParseException:无法在索引10 ''处解析文本'2017-08-03'

3)Java 8提供了几种内置格式,如果它达到了目的,那么应该使用相同的格式,而不是创建一个新格式。

4)由于DateTimeFormatter既是不可变的,也是线程安全的,因此建议将其存储在静态变量中,并在想要使用的任何人之间共享,但请确保该变量既是静态变量又是final变量,以便线程可以读取它但不能分配新的对其进行引用或为null,这可能会导致细微的问题。 有关更多详细信息,请参阅我的文章有关在多线程环境中使用静态变量的危险。

以下是在Java 8中用于将日期格式化或解析为LocalDateTime的代码的摘要:

这就是Java 8中如何使用LocalDateTime格式化和解析日期的全部内容。 就像我说的那样,每个新类(例如LocalDate,LocalTime和LocalDateTime)都具有解析和格式化方法,该方法可用于将字符串转换为日期,反之亦然。 请记住,您需要一个DateTimeFormatter,其模式必须与您的日期字符串匹配,如果不匹配,则两个parse()方法都将引发java.time.format.DateTimeParseException错误。

您还应该记住parse()和format()方法之间的区别,前者是静态的,而后者是非静态的。 您要记住的另一件事是以静态变量的形式或利用JDK中提供的几种内置格式器来重用DateTimeFormatter实例。 您可以进一步阅读《真正不耐烦的Java SE 8》,以了解有关Java 8的新功能的更多信息,包括新的Date and Time API。

您可能想探索的其他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( 教程 )

感谢您到目前为止阅读本文。 如果您喜欢Java 8日期和时间教程以及我的提示,请与您的朋友和同事分享。 如果您有任何问题或反馈,请发表评论。

翻译自: https://www.javacodegeeks.com/2017/08/formatparse-dates-localdatetime-java-8-example-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...

数控刀具选用概述学习数控相关知识,最基础的是认识和了解刀具的材料以及选用原则,我们应当了解数控刀具的种类及特点、如何正确选择和使用数控加工刀具;学会根据被加工材料来合理选择数控刀具的材料和切削参数。选用原则:数控车床…

Java命令行界面(第27部分):cli-parser

CLI Parser最初托管在Google Code上,现在已存档在Google Code上 ,现在可以在GitHub上使用 。 归档的Google Code项目页面将CLI解析器描述为“使用非常简单,非常小的依赖项”,它使用注释“使非常简洁的主要方法不需要知道如何解析带…

linux系统中如何安装qwt,linux下Qt开发环境中qwt库的安装与使用

qwt的安装与使用安装好qt开发环境后,先去下载qwt库源代码。以我下载的qwt-6.0.1.zip为例,解压得到qwt-6.0.1。1.安装qwt-6.0.1执行下面的命令:1 cd qwt-6.0.12 qmake3 make4 make install这样就完成qwt-6.0.1的安装了,安装的路径是…

moxy json介绍_MOXy的对象图和动态JAXB

moxy json介绍JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如DynamicEntity之类的映射实例代替真实的类​​。 您可以使用采用属性名称的get和…

linux 查看服务器作业,linux – 如何在服务器负载较低时运行作业?

我有一个运行磁盘快照的命令(在EC2上,冻结XFS磁盘并运行EBS快照命令),该命令设置为作为cron作业定期运行.理想情况下,如果在任务计划运行时磁盘被大量使用,我希望能够将命令延迟一段时间.我担心使用nice / ionice可能没有正确的效果,因为我希望脚本在运行时以高优先级运行(即等…

wordcloud python3.6能用吗_Python3.6环境下安装wordcloud模块遇到的问题及解决办法

“error: Microsoft Visual C 14.0 is required…”问题解决今天在Python 3.6环境中,制作词云,需要安装wordcloud模块,在安装的过程中遇到了“error: Microsoft Visual C 14.0 is required…” 的问题,很是烦恼,最后找…

使用基本身份验证来保护Spring Boot REST API

这是我的Spring Boot Blog帖子系列的第三篇文章。 在第一篇文章中,我谈到了我使用Spring Boot创建RESTFul Services的经验。 然后我将样本扩展到 与Swagger文档集成 。 在这篇文章中,我将在安全方面扩展上述示例。 什么是API安全性 API安全性广泛&…

使用2.26内核的linux,介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法

介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法来源:互联网作者:佚名时间:2013-04-10 13:32这篇升级Linux内容的文章,是基于Red Hat的Linux版本,从linux 2.6.9-42内核升级到linux 2.6.26-42的方法,对于…

python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel

1.首先安装xlrd\xlwt模块xlrd模块下载地址:https://pypi.python.org/pypi/xlrdxlwt模块下载地址:https://pypi.python.org/pypi/xlwtlinux 安装命令 python setup.py installwindos 安装命令 setup.py install2.使用方法大全基础方法推荐请看这里:http://blog.csdn.net/mr__fan…

linux时间路径,关于linux中的时间 时区问题

本文部分来源于: http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html系统是fedora:glibc实现了从RTC时间到人可读时间的一个转换,一般系统不适用 环境变量TZ进行时区的设置,因为环境变量存在一些缺陷&#xff…

Java命令行界面(第1部分):Apache Commons CLI

尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本,但是有时候我需要解析Java应用程序中的命令行参数,并且有很多库可供Java开发人员用来解析命令行参数。 在本文中,我将介绍这些Java命令行解析库中最著名的一种: Apache Comm…

python自带的idle输入python_打开python自带IDLE出的问题

打开python自带IDLE编辑器时出的问题IDLE cant bind to a TCP/IP port, which is necessary tocommunicate with its Python execution server. This might bebecause no networking is installed on this computer. Run IDLEwith the -n command line switch to start without…

linux 虚拟机新增磁盘,linux(虚拟机)下新增磁盘配置

Linux的硬盘识别:(1)”fdisk -l”命令可以列出系统中当前连接的硬盘设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.(2)创建新硬盘分区命令参数:fdisk可以用m命令来看fdisk命令的内部命令;a:命令指定启动分区;d&#xf…

丙烯怎么做成流体丙烯_韧性好强度高的聚丙烯复合材料怎么做?让人工智能来帮忙...

01背景介绍聚丙烯(PP)是一种应用广泛的通用塑料,价格便宜、力学性能好、热稳定性高,在机械、汽车、电子电器、建筑、纺织、包装和食品工业等领域应用广泛。聚丙烯韧性和冲击强度不高,限制了它的应用。加入热塑性弹性体(TPE),如苯乙…

1.x到2.x的迁移:可观察与可观察:RxJava FAQ

标题不是错误。 rx.Observable 1.x的io.reactivex.Observable与2.x的io.reactivex.Observable完全不同。 盲目升级rx依赖关系并重命名项目中的所有导入将进行编译(稍作更改),但不能保证相同的行为。 在项目的早期, Observable in …

linux 线程 拷贝,linux下实现多线程拷贝命令

实现多线程拷贝命令,如:./multithread_copy srcfile destfile N(拷贝线程个数)难点:内存映射mmap。给每一个线程合理的分配任务。多线程的实现。具体的实现代码如下:/********************************************************************…

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前,vivado已推出2019.1版本,实验室所安装的为2018.3版本,由于软件向下兼容的特性,建议安装2018版本,若安装2019版本,请自带笔记本,安装过程与之前没有差别,这…

linux中kafka主题修改分区,kafka_2.11-2.0.0的部署与配置修改

1 [yunmini01 config]$ pwd2 /app/kafka/config3 [yunmini01 config]$ vim server.properties4 ############################# Server Basics #############################5 # 每一个broker在集群中的唯一标示★★★6 # 比如mini01 为0 mini02 为1 mini03 为27 broker.id089…

python中字符串乘法_python leetcode 字符串相乘实例详解

给定两个以字符串形式表示的非负整数 num1 和 num2 ,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

使用select机制监控是否语音识别结果,在超出等待时间后,会退出等待并重新初始化语音模块LD3320,释放公共资源,这样也使得系统能够及时响应LD3320的MP3播放功能,避免了在长时间没有语音识别结果时,系统进入卡…