首页 > 解决方案 > 如何从现有的 java.util.Date 对象中单独获取时间和日期部分

问题描述

我一直在尝试,但我很惊讶无法为我的简单问题找到解决方案。

我有一个日期变量,其值如下:

res0: java.util.Date = Mon Jul 15 07:50:59 AET 2019

现在我只想要日期部分而不是时间。日期中可用的功能已被弃用。我找到的所有解决方案都是使用日历实例来获取今天的日期时间并使用 SimpleDateFormat 将其转换为字符串。

我不想要一个字符串。我想要一个没有时间部分的日期和一个没有日期部分的时间。

标签: javascaladatetime

解决方案


tl;博士

myJavaUtilDate
.toInstant()
.atZone(
    ZoneId.of( "Australia/Sydney" )
) 
.toLocalDate() 

仅适用于时间,没有日期和时区:

.toLocalTime()

要生成字符串,请调用:

.format(
    DateTimeFormatter
    .ofLocalizedDate( FormatSyle.MEDIUM )
    .withLocale( new Locale( "en" , "AU" ) )
)

细节

立即将您java.util.Date的旧类转换为现代替代品,Instant.

Instant instant = myJavaUtilDate.toInstant() ;

这两个类都代表 UTC 中看到的时刻,即零时分秒的偏移量。调整到您想要感知日期的时区。

对于任何给定时刻,一天中的时间和日期都因全球时区而异。巴黎的中午不是蒙特利尔的中午。东方比西方更早地出现了新的一天。您必须非常清楚这一点才能进行正确的日期时间处理。通过人类创造的时区概念,可以通过多种方式查看自然界中的某一时刻。

以、或等格式指定适当的时区名称。永远不要使用 3-4 个字母的伪时区,例如, ,或者因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandAETESTIST

ZoneId z = ZoneId.of( "Australia/Sydney" ) ;

申请Instant获得ZonedDateTime. 两者都代表相同的同时时刻,但以不同的挂钟时间观看。

ZonedDateTime zdt = instant.atZone( z ) ;

提取仅日期部分。

LocalDate ld = zdt.toLocalDate() ;

提取时间部分。

LocalTime lt = zdt.toLocalTime() ;

将它们重新组合在一起。

ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

如果您需要java.util.Date再次与尚未更新为java.time的旧代码进行互操作,请转换。

Date d = Date.from( zdt.toInstant() ) ;

推荐阅读