由Silambarasan Poonguti提供的被接受的答案和Ramesh Ponnada提供的其他答案都是正确的。但是两者都已过时,使用了早期版本Java中捆绑的旧日期时间类。这些类已被证明存在问题,令人困惑且存在缺陷。
java.time
Java 8及以上版本内置java.time框架,取代旧的java.util.Date/.Calendar类。新类受到高度成功的Joda-Time框架启发,旨在成为其继承者,概念类似但重新架构。由JSR 310定义。由ThreeTen-Extra项目扩展。请参见Oracle教程。
LocalDate
这些新类包括
LocalDate
,用于处理仅包含日期值而不包含时间和时区的情况。尽管LocalDate不包含时区,但请注意时区对于确定诸如“今天”之类的日期至关重要。在任何时刻,世界上的日期并不相同,因为新的一天在东部早些时候开始。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
解析字符串
要解析一个字符串,需要指定一个编码模式。该模式类似于旧的java.text.SimpleTextFormat中使用的模式,但并不完全相同。因此,请务必仔细研究java.time.format.DateTimeFormatter文档。
请注意,我们使用三个M
来指定我们期望得到一周中某天名称的缩写。这是解决问题的关键。
还要注意,我们指定了一个Locale,告诉java.time我们期望的缩写星期几的人类语言。
String input = "02-Mar-2015";
Locale locale = Locale.US;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "dd-MMM-yyyy" ).withLocale ( locale );
LocalDate localDate = LocalDate.parse ( input , formatter );
在控制台中输出。默认情况下,java.time 中的 toString
方法使用标准的ISO 8601格式。
System.out.println ( "localDate: " + localDate );
本地日期:2015-03-02
生成字符串
当生成日期时间值的字符串表示时,通常最好让java.time为您进行本地化,而不是假定特定格式。 java.time.format 包有这样的工作类。
请注意对 withLocale
的调用。Locale 指定了两个元素,预期格式的文化规范和用于星期几和月份名称的人类语言。如果未指定 Locale,则隐式应用JVM的当前默认Locale。最好明确指出,因为默认值随时可能更改。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.SHORT ).withLocale ( Locale.US );
String output = today.format ( formatter );
将数据输出到控制台。
System.out.println ( "output: " + output );
输出结果: 12/29/15
如果您坚持要指定格式,请指定一个编码模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MM/dd/yyyy" );
String output = today.format ( formatter );
输出: 2015年12月29日
转换
如果您手头有一个java.util.Date,请转换为java.time。Instant
是UTC时间线上的一个时刻。
Instant instant = myJUDate.toInstant();
指定所需时区,创建一个日期并返回 ZonedDateTime
对象。
ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ) ;
然后请求生成一个LocalDate,其值从ZonedDateTime中提取。
LocalDate localDate = zdt.toLocalDate();