我需要以下格式的当前日期,时间为 00:00:00 CST。
比如说当前日期是 2021 年 7 月 9 日,那么我需要该日期以及 00:00:00 时间。
预期输出:
Fri Jul 09 00:00:00 CST 2021
当前代码:
LocalDateTime date= LocalDateTime.now().with(LocalTime.MIN);
Date dayStart= Date.from(date.atZone(ZoneId.systemDefault()).toInstant());
电流码输出:Fri Jul 09 00:00:00 UTC 2021
当前代码拾取服务器时间/GMT,比 CST 早 5 小时。
示例:09AM GMT is 14 CST/2PM CST
我尝试将日历设置为 00:00:00 并将时区设置为美国/New_York。但是,当我将输出作为 calendar.getTime() 返回时,请提供一些其他时间,而不是给 CST 00:00:00。
试过:@scheduled(zone="America/New_york" )
--不起作用。
有两个很好的答案。我的建议仅在细节上有所不同(根据某些人的说法,这就是魔鬼所在的地方)。
首先,如果可以的话,你应该避免使用Date
类。您已经在使用 java.time,现代 Java 日期和时间 API(LocalDateTime
、LocalTime
、ZoneId
)。您将从java.time获得所需的所有功能。所以我假设你只是在转换为Date
,因为你需要一个Date
一些遗留的API,你现在负担不起升级到java.time的费用。
Instant startOfDay = ZonedDateTime.now(ZoneId.systemDefault())
.truncatedTo(ChronoUnit.DAYS)
.toInstant();
Date oldfashionedDate = Date.from(startOfDay);
System.out.println(oldfashionedDate);
.truncatedTo(ChronoUnit.DAYS)
丢弃了ZonedDateTime
的时间部分,通常会让我们在同一时区的同一天 00:00:00。
编辑:
我要美国芝加哥时间CDT
运行上述代码,将 JVM 的默认时区设置为美国/芝加哥,得到:
周一 7月 12 00:00:00 CDT 2021
获取正确的Date
值和获得预期的打印输出是两回事,因为Date.toString()
选择 JVM 的默认时区并使用它来呈现要返回的字符串。这种行为可能会带来惊喜。无法说服Date.toString()
使用不同的时区,因此上述输出只能通过设置默认时区来实现。
原文:有很多时区被称为CST,我无法确定你打算使用哪一个(我相信美国/New_York不是其中之一的评论是正确的)。然而,我唯一能说服老式Date
班缩写CST的是中国标准时间。在亚洲/上海时区运行上述代码给出了以下输出:
2021 年 7 月 10 日星期六 00:00:00 CST
在我看来,它看起来很对。自从您提出问题以来,它已成为中国标准时区的10日星期六。
任何时区都可以获得正确的Date
值,即该时区一天的开始。您还希望在打印输出中使用CST
的缩写。不适用于此的时区包括:
- 澳大利亚/阿德莱德时区。输出
Sat Jul 10 00:00:00 ACST 2021
。因此,尽管澳大利亚中部标准时间有时缩写为CST,Date
选择了ACST。 - 美洲/哈瓦那。古巴在每年的这个时候使用古巴夏令时,因此输出 CDT。
- 美国/温尼伯和美国/芝加哥。 北美中部时间也使用夏令时,因此此处也输出 CDT。
无论如何,你知道你想要哪个时区,所以我让你选择。
更改时区的最简单方法是使用 System.setProperty("user.timezone", "America/New_York"); 在 Java 中 注意:: 美国/New_York 不是 CST
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
class DateAndTimeZoneFormatter {
public static void main(String[] args) {
System.setProperty("user.timezone", "America/New_York");
LocalDateTime date = LocalDateTime.now().with(LocalTime.MIN);
Date dayStart = Date.from(date.atZone(ZoneId.systemDefault()).toInstant());
System.out.println(dayStart);
}
}
您可以尝试使用具有特定ZoneId
的ZonedDateTime
:
public static void main(String[] args) {
// define the zone to be used
ZoneId americaChicago = ZoneId.of("America/Chicago");
// then take the date of today
ZonedDateTime nowInChicago = ZonedDateTime.of(
LocalDate.now(), // today
LocalTime.MIN, // start of day
americaChicago // zone
);
// define an output format
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss")
.appendLiteral(' ')
.appendZoneText(TextStyle.SHORT)
.appendLiteral(' ')
.appendPattern("uuuu")
.toFormatter(Locale.ENGLISH);
// then print the formatted String representation
System.out.println(nowInChicago.format(dtf));
}
这输出
Fri Jul 09 00:00:00 CDT 2021
缺点:
- 由于
CST
是夏令时,因此未应用因此无法完全匹配预期输出。因此,CDT
将是输出。 Date.from
此ZonedDateTime.toInstant()
将影响值:
应用这两条线
Date sameNowInChicago = Date.from(nowInChicago.toInstant());
System.out.println(sameNowInChicago);
将输出
Fri Jul 09 07:00:00 CEST 2021
在我的机器上,因为它配置为具有ZoneId.of("Europe/Berlin")
,在中欧夏令时打印 .
CEST⇒java.util.Date
时将考虑到这一点。