如何在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解析器描述为“使用非常简单,非常小的依赖项”,它使用注释“使非常简洁的主要方法不需要知道如何解析带…

使用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的方法,对于…

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

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

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

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

vivado安装_Vivado下载与安装指南

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

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

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

windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

每当我问到客户,“你用什么存储产品作为文件共享?”经常听到的一个答案(自豪滴)是,“文件共享需要存储么?我们用Windows就可以做到。”Windows就是个百宝箱,什么都能往里装,就像你家冰箱一样。众所周知&…

pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展

土壤营养元素流失、重金属污染是当前全球面临的突出环境问题。生物炭因其具有比表面积较大、吸附性能高和成本低等优点而在环境修复领域日益受到广泛关注,被作为水处理吸附剂、土壤修复改良剂广泛应用于农业土壤改良和环境中重金属的修复和钝化。但通常情况下&#…

Java命令行界面(第26部分):CmdOption

由于Tweet,我了解了本系列中第26个基于Java的功能强大的库,该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的,用于Java 5应用程序的简单注释驱动的命令行解析器工具包。” 该项目的副标题是“命令行解析从未…

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止

C.62: Make copy assignment safe for self-assignmentC.62:保证拷贝赋值对自我赋值安全Reason(原因)If x x changes the value of x, people will be surprised and bad errors will occur (often including leaks).如果xx改变了x的值,人们会觉得很奇怪&#xff0…

华为编程规范_华为 Java 编程规范出炉,究竟和官方文档有何不同?

来源:blog.csdn.net/chenleixing/article/details/441739851、引言这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司,十几万员工,无论是人事管理,还是代码管理&#xff0c…

Java命令行界面(第19部分):jClap

本系列中第19篇文章的重点是从Java代码解析命令行参数是jClap ( Java命令行参数解析器 ),不应将它与称为JCLAP的库相混淆,而JCLAP库是我本系列先前文章的重点。 在以前的帖子覆盖JCLAP 1.4加尔斯吉尔温斯坦利( snaq.ne…

Java命令行界面(第22部分):argparser

John Lloyd的argparser是本系列的第二十二篇有关基于Java的命令行参数解析的文章中介绍的库。 该库的主页除了提供单个源代码示例外,还提供了指向基于Javadoc的API文档 ,JAR文件,ZIP文件和TAR文件的链接。 本帖子中使用的示例与本系列的前二十…

如何粗暴地下载huggingface_hub指定数据文件

参考这里: https://huggingface.co/docs/huggingface_hub/guides/download 可见下载单个文件,下载整个仓库文件都是可行的。 这是使用snapshot_download下载的一个例子: https://qq742971636.blog.csdn.net/article/details/135150482 sn…

顺序表输入栈元素c语言,C语言数据结构之栈简单操作

C语言数据结构之栈简单操作实验:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称…

25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势

存储虚拟化是一种对物理存储资源进行抽象的技术,使其看起来像是一个集中的资源。虚拟化掩盖了管理内存、网络、服务器和存储中资源的复杂性。存储虚拟化运行在多个存储设备上,使它们看起来就像一个单一的存储池。这些池化的存储设备可以来自不同的供应商…

android代码画出波浪球,Android绘制波浪曲线,效果很赞的。

github地址:https://github.com/sddyljsx/Android-SurfView-WaveViewpackage neal.canvas;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import and…

Java命令行界面(第14部分):google-options

google-options的GitHub页面指出google-options是“来自Google(java)的人们的命令行参数解析库。” 该页面继续说:“这是Bazel Project中的命令行参数解析器。 com.google.devtools.common.options程序包已拆分为一个单独的jar,用…

android 输入法文本选择功能,Android的文本和输入---创建输入法(一)

输入法编辑器(IME)是让用户输入文本的控件。Android提供了一个可扩展的的输入法的框架,它允许应用程序给用户提供另外的输入法,如软键盘或语音输入。这些输入法一旦安装,用户就可以从系统的设置中选择他们想要使用的IME,并且这个设…