如何在Java中将字符串转换为⽇期
将Java(或任何编程语⾔)中的字符串转换为⽇期是⼀项基本技能,对于在项⽬上进⾏⼯作很有⽤。有时,使⽤字符串表⽰⽇期,然后将其转换为Date对象以供进⼀步使⽤是更容易的。
在本⽂中,我们将介绍许多可⽤于将Java字符串转换为⽇期对象的⽅法和库。
⽇期/时间API
Java中的⽇期/时间API默认情况下使⽤格式(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。
如果仍然不能满⾜您对⾃定义格式器的需求,则可以使⽤来构建⾮常具体且复杂的格式器。除其他外,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.TimeZone("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”,因为它处于不同的时区。
SimpleDateFormat与DateTimeFormatter
阅读本⽂,很容易提出⼀个问题-“有什么区别,我应该使⽤哪个? ”
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 = w();
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
开发是为了解决旧的Java时间和⽇期类的问题。
从Java 8开始,这些问题已得到纠正,并且Joda-Time已达到其⽬的。甚⾄它的作者都建议迁移到官⽅,java.time以便确定⽇期和时间。
如果这是不可能的,并且对于仍然使⽤Java 8之前的Java版本的⽤户,Joda-Time仍然是⼀个不错的库。
该库的依赖项可以通过依赖项轻松添加:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>{version}</version>
string转date的方法</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
是许多项⽬中使⽤的有⽤库。
要将这个库添加到您的项⽬中,可以使⽤Maven依赖项:
<dependency>
<groupId>org.apachemons</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" });
使⽤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来完成。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论