在 Java 中获取 CST 当前日期 00:00:00 时间



我需要以下格式的当前日期,时间为 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(LocalDateTimeLocalTimeZoneId)。您将从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);
}
}

您可以尝试使用具有特定ZoneIdZonedDateTime

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.fromZonedDateTime.toInstant()将影响值:

应用这两条线

Date sameNowInChicago = Date.from(nowInChicago.toInstant());
System.out.println(sameNowInChicago);

将输出

Fri Jul 09 07:00:00 CEST 2021

在我的机器上,因为它配置为具有ZoneId.of("Europe/Berlin"),在中欧夏令时打印 .
CESTjava.util.Date时将考虑到这一点。

相关内容

  • 没有找到相关文章

最新更新