猿问

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

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

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

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

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

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


MMMHUHU
浏览 213回答 4
4回答

牧羊人nacy

博士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/AucklandAETESTISTZoneId 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() ) ;

料青山看我应如是

您可以使用本地日期val input = new Date() // your date val date = input.toInstant().atZone(ZoneId.of("Europe/Paris")).toLocalDate()

潇湘沐

我们可以使用日期格式化程序来做到这一点,你可以试试下面的代码。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 2019parsedDate: Tue Jul 23 07:08:05 NPT 2019dateOnly: 2019-07-23timeOnly: 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.850localeDate: 2019-07-23现在的类型是LocaleTime和LocaleDate分别。

蝴蝶不菲

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。
随时随地看视频慕课网APP

相关分类

Java
我要回答