tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
细节
我有一个格式为yyyy-mm-dd的java.util.Date
如前所述, Date
该类没有格式。自1970年UTC以来,它具有毫秒数。没有任何附加条件。
java.time
其他答案使用麻烦的旧式旧式日期时间类,现在由java.time类取代。
如果有java.util.Date
,则转换为Instant
对象。该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = myUtilDate.toInstant();
时区
其他答案则忽略了时区这一关键问题。确定日期需要一个时区。在任何给定时刻,日期都会在全球范围内变化。在巴黎午夜过后的几分钟,法国是新的一天,而在魁北克蒙特利尔仍然是“昨天”。
定义您要为其提供上下文的时区Instant
。
ZoneId z = ZoneId.of( "America/Montreal" );
套用ZoneId
取得ZonedDateTime
。
ZonedDateTime zdt = instant.atZone( z );
LocalDate
如果您只关心日期而不是时间,请提取LocalDate
。
LocalDate localDate = zdt.toLocalDate();
要生成标准ISO 8601格式的字符串YYYY-MM-DD,只需调用toString
。生成/解析字符串时,默认情况下java.time类使用标准格式。
String output = localDate.toString();
2017-01-23
如果要使用MM-DD-YYYY格式,请定义格式格式。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
请注意,格式化模式代码区分大小写。问题中的代码使用不正确mm
(小时数),而不是MM
(一年中的月份)。
使用相同的DateTimeFormatter
对象进行解析。java.time类是线程安全的,因此您可以保留该对象,甚至在线程之间也可以重复使用。
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容打下了基础。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。