为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2023-04-13 10:24:25
我一直在尝试,但我很惊讶无法为我的简单问题找到解决方案。我有一个日期变量,它的值如下:res0: java.util.Date = Mon Jul 15 07:50:59 AET 2019现在我只想要日期部分而不是时间。Date 中可用的函数已弃用。我发现的所有解决方案都是使用 Calendar 实例获取今天的日期时间并使用 SimpleDateFormat 将其转换为字符串。我不想要一个字符串。我想要一个没有时间部分的日期和一个没有日期部分的时间。
查看完整描述

4 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

博士

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() ) ;


查看完整回答
反对 回复 2023-04-13
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

您可以使用本地日期

val input = new Date() // your date
val date = input.toInstant().atZone(ZoneId.of("Europe/Paris")).toLocalDate()


查看完整回答
反对 回复 2023-04-13
?
潇湘沐

TA贡献1816条经验 获得超6个赞

我们可以使用日期格式化程序来做到这一点,你可以试试下面的代码。


object DateFormatter extends App {

  val sdf = new SimpleDateFormat("EEEE MMMM dd, HH:mm:ss:SSS Z yyyy", Locale.ENGLISH)

  val date = new Date()

  val nowDate = sdf.format(date)

  println(nowDate)

  // It prints date in this format Monday July 22, 23:40:07:987 +0545 2019


  // Lets print the date in the format you have provided in your question

  val parsedDate = sdf.parse(nowDate)

  println(parsedDate)


  // Now, we have same date format as yours


  // Now we have to remove the time and keep the date part only, for this we can do this

  val newDateFormat = new SimpleDateFormat("yyyy-MM-dd")

  val dateOnly = newDateFormat.format(parsedDate)

  println(dateOnly)


  //Printing time only

  val timeFormatter = new SimpleDateFormat("HH:mm:ss")

  val timeOnly = timeFormatter.format(parsedDate)

  println(timeOnly)


  }

输出:


nowDate: Tuesday July 23, 07:08:05:857 +0545 2019

parsedDate: Tue Jul 23 07:08:05 NPT 2019

dateOnly: 2019-07-23

timeOnly: 07:08:05

更新


val dateNotInString = newDateFormat.parse(dateOnly)

  println(dateNotInString)

更新输出:


dateNotInString: Tue Jul 23 00:00:00 NPT 2019

在这里,您可以看到这dateNotInString是一个日期对象,它不包含任何与时间相关的信息。类似地,可以提取仅时间信息。


第二次更新


我们不能使用SimpleDateFormatwith 类型得到没有时间部分和日期部分的日期not String,但我们可以将其转换为LocaleDateand LocaleTime。


import java.time.Instant


  val instantTime = Instant.ofEpochMilli(parsedDate.getTime)


  import java.time.LocalDateTime

  import java.time.LocalTime

  import java.time.ZoneId


  val res = LocalDateTime.ofInstant(instantTime, ZoneId.systemDefault).toLocalTime

  println("localeTime " + res)


  val res1 = LocalDateTime.ofInstant(parsedDate.toInstant,ZoneId.systemDefault).toLocalDate

  println("localeDate " + res1)

第二次更新的输出


localeTime: 18:11:30.850

localeDate: 2019-07-23

现在的类型是LocaleTime和LocaleDate分别。


查看完整回答
反对 回复 2023-04-13
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

Date date = new Date(res0.getTime() - (res0.getTime() % 86400000));
    System.out.println(date);

现在您可以像使用 res0 日期一样使用日期格式化程序,它只会打印日期。但我试图做的是删除时间部分,基本上 86400000 是每天的毫秒数,getTime 返回自格林威治标准时间 1970 年 1 月 1 日 00:00:00 以来经过的毫秒数。所以基本上这相当于每天 00:00.00 的日期。我不知道这是否是您想要的,因为 Date 不包含日期和时间等 2 个独立的东西,它只有一个 long。


查看完整回答
反对 回复 2023-04-13
  • 4 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信