The 接受的答案 https://stackoverflow.com/a/34504314/642706通过 Silambarasan Poonguti 和其他答案 https://stackoverflow.com/a/34504277/642706Ramesh Ponnada 的观点都是正确的。但两者都已经过时了,使用与最早版本的 Java 捆绑在一起的旧日期时间类。事实证明,这些类很麻烦、令人困惑并且存在缺陷。
java.time
The java.time http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.htmlJava 8 中内置的框架,后来取代了旧的 java.util.Date/.Calendar 类。新课程的灵感来自于非常成功的乔达时间 http://www.joda.org/joda-time/框架,旨在作为其继承者,概念相似但重新架构。被定义为JSR 310 http://jcp.org/en/jsr/detail?id=310。扩展为三十额外 http://www.threeten.org/threeten-extra/项目。请参阅甲骨文教程 http://docs.oracle.com/javase/tutorial/datetime/TOC.html.
LocalDate
这些新课程包括LocalDate http://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html用于处理没有时间或时区的仅日期值。尽管 LocalDate 不包含时区,但请注意,时区对于确定“今天”等日期至关重要。世界各地的日期在任何时刻都不相同,因为东方新的一天黎明得更早。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
解析字符串
要解析字符串,请指定编码模式。此模式与旧的 java.text.SimpleTextFormat 中使用的模式类似,但并不完全相同。所以一定要研究一下java.time.format.DateTimeFormatter http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html密切关注医生。
请注意,我们使用三元组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 );
转储到控制台。默认情况下toString
java.time 中的方法使用标准ISO 8601 https://en.wikipedia.org/wiki/ISO_8601格式。
System.out.println ( "localDate: " + localDate );
本地日期: 2015-03-02
生成字符串
当生成日期时间值的字符串表示形式时,通常最好让 java.time 为您本地化它,而不是采用特定的格式。这java.time.format http://docs.oracle.com/javase/8/docs/api/java/time/format/package-summary.html包中有用于此类工作的类。
请注意调用withLocale
。区域设置指定两个元素:预期格式的文化规范以及用于日期和月份名称的人类语言。如果不指定区域设置,则隐式应用 JVM 当前的默认区域设置。最好明确一点,因为默认值可以随时更改。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.SHORT ).withLocale ( Locale.US );
String output = today.format ( formatter );
转储到控制台。
System.out.println ( "output: " + output );
输出:2015 年 12 月 29 日
如果您坚持使用特定格式,请指定编码模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MM/dd/yyyy" );
String output = today.format ( formatter );
输出:2015年12月29日
转换
如果您手头有 java.util.Date,请转换为 java.time。一个Instant http://docs.oracle.com/javase/8/docs/api/java/time/Instant.html是时间线上的一个时刻UTC https://en.wikipedia.org/wiki/Coordinated_Universal_Time.
Instant instant = myJUDate.toInstant();
指定您想要形成日期的时区,产生ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ) ;
然后要求生成一个 LocalDate,其值从 ZonedDateTime 中提取。
LocalDate localDate = zdt.toLocalDate();