如何从现有 java.util.Date 对象中单独获取时间和日期部分

Sim*_*low 3 java time scala date

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

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

res0: java.util.Date = Mon Jul 15 07:50:59 AET 2019
Run Code Online (Sandbox Code Playgroud)

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

我不想要一根绳子。我想要一个不带时间部分的日期和一个不带日期部分的时间。

Bas*_*que 6

太长了;博士

\n\n
myJavaUtilDate\n.toInstant()\n.atZone(\n    ZoneId.of( "Australia/Sydney" )\n) \n.toLocalDate() \n
Run Code Online (Sandbox Code Playgroud)\n\n

仅适用于一天中的时间,没有日期和时区:

\n\n
.toLocalTime()\n
Run Code Online (Sandbox Code Playgroud)\n\n

要生成字符串,请调用:

\n\n
.format(\n    DateTimeFormatter\n    .ofLocalizedDate( FormatSyle.MEDIUM )\n    .withLocale( new Locale( "en" , "AU" ) )\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

细节

\n\n

立即将您的产品java.util.Date从传统类别转换为现代替代品Instant.

\n\n
Instant instant = myJavaUtilDate.toInstant() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
ZoneId z = ZoneId.of( "Australia/Sydney" ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
ZonedDateTime zdt = instant.atZone( z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

提取仅包含日期的部分。

\n\n
LocalDate ld = zdt.toLocalDate() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

提取一天中的时间部分。

\n\n
LocalTime lt = zdt.toLocalTime() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

再次将它们放回一起。

\n\n
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Date d = Date.from( zdt.toInstant() ) ;\n
Run Code Online (Sandbox Code Playgroud)\n