java - 如何从现有的 java.util.Date 对象中单独获取时间和日期部分
问题描述
我一直在尝试,但我很惊讶无法为我的简单问题找到解决方案。
我有一个日期变量,其值如下:
res0: java.util.Date = Mon Jul 15 07:50:59 AET 2019
现在我只想要日期部分而不是时间。日期中可用的功能已被弃用。我找到的所有解决方案都是使用日历实例来获取今天的日期时间并使用 SimpleDateFormat 将其转换为字符串。
我不想要一个字符串。我想要一个没有时间部分的日期和一个没有日期部分的时间。
解决方案
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/region
America/Montreal
Africa/Casablanca
Pacific/Auckland
AET
EST
IST
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() ) ;
推荐阅读
- javascript - 如果检查,我可以从龙卷风模板调用 JavaScript 函数吗?
- ios - 根据内容使集合视图高度动态
- javascript - 无法将节点 8 用于 Firebase 功能
- angular - 我需要使用哪些设置来确保我的单元测试由 Jenkins 自动运行?
- angular - 用于大量未指定显示的角数管 (E+45)
- sql - 如何在 MS Access 中根据日期删除多个重复项
- r - dplyr::pull 与 purrr::pluck 和 magrittr::extract2 的区别是什么?
- c++ - 如何使用一维数组列表初始化二维数组?
- php - PHP rtrim 函数修剪多余的字符?为什么?
- mysql - python mysql中表名的占位符