4 回答
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/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() ) ;
TA贡献1772条经验 获得超8个赞
您可以使用本地日期
val input = new Date() // your date val date = input.toInstant().atZone(ZoneId.of("Europe/Paris")).toLocalDate()
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分别。
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。
添加回答
举报