将Java(或任何编程语言)中的字符串转换为日期是一项基本技能,对于在项目上进行工作很有用。有时,使用字符串表示日期,然后将其转换为Date对象以供进一步使用是更容易的。

在本文中,我们将介绍许多可用于将Java字符串转换为日期对象的方法和库。

日期/时间API

Java中的日期/时间API默认情况下使用ISO 8601格式(yyyy-MM-dd)。

默认情况下,所有日期都遵循此格式,如果您使用默认格式器,则所有转换后的字符串都必须遵循该格式。

parse()

该API定义了一种parse()方法,该方法接受字符序列并使用ISO_LOCAL_DATE格式来解析输入:

parse(CharSequence);

另外,您可以使用此方法的两个参数的变体,定义一个不同的格式化程序:

parse(CharSequence, DateTimeFormatter);

DateTimeFormatter用于在新的日期/时间API中格式化和解析日期时间对象。此API中的所有日期时间类都包含一种用于解析和格式化的方法,其中每个方法都接受DateTimeFormatter来定义模式。

将字符串转换为LocalDate

LocalDate表示日期,没有ISO-8601格式的时间。

它与Date以下事实的不同之处在于,它不将时间存储为自纪元以来的毫秒偏移量,而只是存储当前日期。它也是Date / Time API的较新实现,并提供了自己的格式/解析方法,以及日,周和年的加减法,这在Date变体中不存在。

要将字符串转换为LocalDate对象,只需编写以下代码:

LocalDate date = LocalDate.parse("2018-09-16");

这等效于编写处理代码以实例化LocalDate对象:

LocalDate date = LocalDate.of(2018, 09, 16);

将字符串转换为LocalTime

LocalTime代表时间,不带ISO-8601格式的时区。它不存储自历元以来的偏移时间,而是提供纳秒级精度。

与LocalDate一样,它提供了许多内置的非常有用的解析和格式化方法,以及从中添加或减去时间的方法。

要将字符串转换为LocalTime对象,只需编写以下代码:

LocalTime localTime = LocalTime.parse("08:00");

这等效于编写处理代码以实例化LocalTime对象:

LocalTime localTime = LocalTime.of(8, 00);

将字符串转换为LocalDateTime

这LocalDateTime是Java中有关日期/时间的最常用的类。它代表日期和时间的组合,可以用于许多目的:

LocalDateTime localDateTime = LocalDateTime.parse("2018-09-16T08:00:00");

乍一看,这种格式可能令人困惑,但实际上非常简单:

“时间”标记仅表示格式的LocalDate和之间的一条线LocalTime。

您还可以轻松地将其格式化LocalDateTime为更具可读性的格式:

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

String formatDateTime = localDateTime.format(formatter);

运行这段代码并打印formatDateTime将产生:

2018-09-16 08:00:00

您通常会这样做,以便在LocalDateTime事先对对象执行操作的同时以字符串格式向最终用户显示结果。

将字符串转换为ZonedDateTime

根据要处理的项目,在处理日期和时间时,可能需要处理不同的时区。

将字符串转换为ZonedDateTime对象很简单:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-09-16T08:00:00+00:00[Europe/London]");

上面的示例显示了如何初始化ZonedDateTime伦敦的。

使用自定义格式化程序转换字符串

有时,我们可能希望使用我们自己的自定义格式化程序,该格式化程序以多种方式接受字符串,但仍然不会抛出DateTimeParseException。

这是一些最常见的模式:

  • y:年(2018,18)
  • M:一年中的一个月(08年8月,8月)
  • d:一个月中的某天(1、5、25)
  • E:一周中一天的名称(周一,周六)
  • a:前子午/后子午标记(AM,PM)
  • H:24小时制的小时(1、7、14、21)
  • h:12小时风格的小时(1、5、12)
  • m:一小时内的分钟数(1、25、54)
  • s:一分钟内的秒数(1、25、54)

还有一些您可能不会经常使用:

  • G:时代代号(AD,CE)
  • Y:周年(2018,18)
  • w:一年中的一周(25,53)
  • W:一个月中的一周(2)
  • D:一年中的一天(254)
  • F:一个月中的星期几(3)
  • E:一周中的日期名称(星期一,星期一)
  • u:一周的天数(1、4)
  • k:一天中的小时(17)
  • K:一天中的AM / PM小时(5)
  • S:毫秒(1245)
  • z:一般时区(太平洋标准时间;太平洋标准时间; GMT-8:00)
  • Z:RFC 822时区(-0800)
  • X:ISO 8601时区(-08,-0800,-8:00)

注意:周年与年份不同-周年与WEEK_OF_YEAR周期同步。第一周到最后一周(包括最后一周)之间的所有星期都具有相同的周年值。因此,一周的第一天和最后一天可能具有不同的日历年值。

注意: K和H相同的方式k和h不同。H和h分别指的是0-23和1-12的模式,而K与k分别指的是0-11和1-24。

如果仍然不能满足您对自定义格式器的需求,则可以使用DateTimeFormatterBuilder来构建非常具体且复杂的格式器。除其他外,DateTimeFormatter是使用此类构建的。

java.util.Date

这是一种较旧的方法,如今已不常用,但仍然值得一提,因为有时我们仍使用这些API中的类:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

Date date = formatter.parse("22-Sep-2018");

我们可以将许多模式传递给的构造函数SimpleDateFormat。您可以使用可用的模式来组合几乎任何数量的格式。

无法为日期设置时区,因为它根本不包含此类信息。但是,很容易格式化日期并将时区信息添加到字符串中:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = formatter.parse("22-09-2018 08:23:43 PM");

String formattedDate = formatter.format(date);

System.out.println(date);

System.out.println(formattedDate);

运行这段代码将产生:

Sat Sep 22 22:23:43 CEST 2018

22-9-2018 08:23:43 PM

“ 22:23:43 CEST”对应于“ 10:23:43 PM”时间,而格式化日期则代表“ 8:23:43 PM”,因为它处于不同的时区。

SimpleDateFormatDateTimeFormatter

阅读本文,很容易提出一个问题-“有什么区别,我应该使用哪个? ”

DateTimeFormatter是在Java 8中新添加的Date / Time API,并替换了较旧的,现在已不常用的SimpleDateFormat。与旧版本不同,它是线程安全的,并提供新功能:

// SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy");

Date date = new Date();

String formattedDate = formatter.format(date);

Date parsedDate = formatter.parse(formattedDate);

// DateTimeFormatter

LocalDate date = LocalDate.now();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy");

String formattedDate = date.format(formatter);

LocalDate parsedDate = LocalDate.parse(formattedDate, formatter);

很明显看到这两者之间的区别。在较旧的方式中,格式化程序用于格式化然后解析日期。以更新的方式,日期具有其自己的格式和解析方法,并且DateTimeFormatter仅将模式用作模式。

如果您正在使用Java 8和新API,请使用DateTimeFormatter,而如果您仍在使用Java的旧版本,请使用SimpleDateFormat。

Joda-Time

开发Joda-Time是为了解决旧的Java时间和日期类的问题。

从Java 8开始,这些问题已得到纠正,并且Joda-Time已达到其目的。甚至它的作者都建议迁移到官方,java.time以便确定日期和时间。

如果这是不可能的,并且对于仍然使用Java 8之前的Java版本的用户,Joda-Time仍然是一个不错的库。

该库的依赖项可以通过Maven依赖项轻松添加:

<dependency>

<groupId>joda-time</groupId>

<artifactId>joda-time</artifactId>

<version>{version}</version>

</dependency>

使用Joda-Time与使用Java的Date / Time API非常相似:

DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);

Joda-Time的DateTime也支持时区:

DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);

DateTime dateTimeZoned = dateTime.withZone(DateTimeZone.forID("Europe/London));

有关可用的时区ID的完整列表,请访问官方文档。

Apache Commons

Apache Commons是许多项目中使用的有用库。

要将这个库添加到您的项目中,可以使用Maven依赖项:

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>{version}</version>

</dependency>

以下两种实现都接受一系列模式。这些方法将依次解析每个模式。如果没有模式与输入字符串匹配,ParseException则抛出a。

使用DateTimeConverter

DateTimeConverter dtc = new DateConverter();

dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" });

ConvertUtils.register(dtc, Date.class);

使用DateUtils

Date date = DateUtils.parseDate("22-Sep-2018", String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});

结论

我们已经介绍了将Java中的简单String转换为Date和Date-Time类的多种方法。其中一些方法利用了您的项目中可能已经拥有的第三方库,而另一些方法则利用了Java提供的API来完成。

如何在Java中将字符串转换为日期相关推荐

  1. 在Java中将字符串转换为日期,将日期转换为字符串

    Sometimes we have to Convert String to Date in java program or convert Date to String in a different ...

  2. java中如何将字符串转化为字符_如何在Java中将字符串转换为运算符?

    参见英文答案 > Is it possible to pass arithmetic operators to a method in java?                         ...

  3. 如何在Java中将String转换为int?

    如何在Java中将String转换为int ? 我的字符串仅包含数字,我想返回它代表的数字. 例如,给定字符串"1234" ,结果应为数字1234 . #1楼 好吧,要考虑的一个非 ...

  4. 如何在Java中将String转换为int

    在本教程中,我们将看到将Java中的String转换为int(或Integer)的各种方法. 您可以使用以下任何一种方式: –使用Integer.parseInt(string) –使用Integer ...

  5. 在Java中将字符串转换为char数组,将char数组转换为String

    Today we will learn how to convert String to a char array and then char array to String in Java. 今天, ...

  6. linux shell转换成时间,如何在Bash中将时间戳转换为日期?

    如何在Bash中将时间戳转换为日期? 我需要一个将Unix时间戳转换为日期的shell命令或脚本. 输入可以来自第一个参数或来自stdin,允许以下使用模式: ts2date 1267619929 和 ...

  7. 如何在Java中将double转换为int?

    在本文中,我们将看到如何将double转换为int. 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Ja ...

  8. java中long如何使用_如何在Java中将long转换为int?

    问题 如何在Java中将long转换为int? #1 热门回答(218 赞) 简单类型转换应该这样做: long l = 100000; int i = (int) l; 但请注意,大数(通常大于21 ...

  9. java中将字符串顺序反传转_如何在Java中将字符串序列化的Erlang术语反序列化为JInterface对象?...

    我的接口系统提供了来自Erlang世界的结果,该结果发送了erlang术语的字符串表示形式,例如元组列表: [ {"key1" , ["AAA","B ...

最新文章

  1. 三阶魔方花样玩法,公式汇总
  2. 加你用移动端数据爬取
  3. Java Servlet监听器的分类
  4. php上传图片类型代码,php 上传图片的代码
  5. 【android】环形进度条实现
  6. a*算法matlab代码_MATLAB数学建模算法的代码模板大全
  7. 雷军和董明珠“十亿赌局”胜负已定:小米格力营收差距依然很大
  8. Windows 8 Directx 开发学习笔记(四)示例程序小结
  9. 关于Shell脚本执行python代码,出现No such file or directorython: can't open file的问题
  10. 关于matlab的图像显示方法
  11. linux编译C文件两种方法
  12. 使用 乐吾乐topology 遇到的问题解决方法汇总
  13. “80后”!顶尖985,迎新副校长!
  14. PowerDesigner 15破解版下载
  15. 紫外线杀菌器:紫外线杀菌的原理分析
  16. android4.4广播,Android4.4 framework分析——广播的注册(BroadcastReceiver)和发送(sendbroadcast)过程分析...
  17. 解决 Hyper-V R2 虚拟网卡影响网速变慢问题
  18. mysql group_concat去重_mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格...
  19. 硬盘突然变raw格式_硬盘变成raw格式的解决方法详解
  20. 【媳妇当车模频道】汽车字体反爬一键解决,之家之家,2022.5.19 更新

热门文章

  1. java项目管理软件系统springboot+mysql+layui+mybatis-plus进销存源码
  2. A Game of Thrones(41)
  3. 感觉自己不会的东西太多了,不知道如何下手?
  4. 如何成为高效的学习高手-摘要
  5. 制造业ERP怎么创新与转型(阿朱说)
  6. python判断火车票座位号分布图_火车票怎么看车厢号和座位号
  7. 数学建模三大类模型适用场景及建模方法(纯干货)
  8. Crosstalk高速信号质量测试仪
  9. Chrome 浏览器调试的日常使用总结
  10. 解决git Please use -- (and optionally --no-guess) to disambiguate