获取java中00:00:00时间的cst当前日期

bwntbbo3  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(492)

我需要cst时间00:00:00以下格式的当前日期。
比如说当前日期是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());

currentcode的输出: Fri Jul 09 00:00:00 UTC 2021 当前代码拾取服务器时间/gmt,比cst提前5小时。
例子: 09AM GMT is 14 CST/2PM CST 我已尝试将日历设置为00:00:00,并将时区设置为美国/纽约。但是,当我以calendar.gettime()返回输出时,请给我一些其他时间,而不是cst 00:00:00。
尝试: @scheduled(zone="America/New_york" ) --不工作。

x9ybnkn6

x9ybnkn61#

有两个很好的答案。我的建议只是在细节上有所不同(根据一些人的说法,这就是问题所在)。
首先,你应该避免使用 Date 如果可以,请上课。您已经在使用java.time,即现代java日期和时间api( LocalDateTime , LocalTime , ZoneId ). 您正在从java.time获得所需的所有功能。所以我假设你只是转换成 Date 因为你需要一个 Date 对于一些您现在无法升级到java.time的遗留api。

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离开我们。
得到正确的答案 `Date` 值和获得预期的打印输出是两件不同的事情 `Date.toString()` 选择jvm的默认时区,并使用它呈现要返回的字符串。这种行为可能会令人惊讶。
有很多时区被称为cst,我无法确定你想要哪个时区(我相信那些说美国/纽约不是其中之一的评论是正确的)。然而,我唯一能说服的是老派 `Date` 缩写为cst的班级是中国标准时间。在亚洲/上海时区运行上述代码得到以下输出:
美国标准时间2021年7月10日星期六00:00:00
在我看来这是对的。自从你问了你的问题,现在已经是中国标准时区的第10个星期六了。
任何时区都有助于获得正确的时间 `Date` 值,该时区中一天的开始。你还想要一个 `CST` 在打印输出中。不适用于此的时区包括:
澳大利亚/阿德莱德时区。产量为 `Sat Jul 10 00:00:00 ACST 2021` . 因此,尽管澳大利亚中央标准时间有时缩写为cst, `Date` 选择acst。
美国/哈瓦那。cuba在一年中的这个时候使用cuba夏令时,所以cdt是输出的。
美国/温尼伯和美国/芝加哥。北美中部时间也使用夏令时,所以这里也输出cdt。
无论如何,你知道你想要哪个时区,所以我让你来选择。
sqserrrh

sqserrrh2#

更改时区最简单的方法是使用system.setproperty(“user.timezone”,“america/new_york”);在java中注意:美国/纽约不是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);

    }

}
bqujaahr

bqujaahr3#

你可以试着使用 ZonedDateTime 以特定的方式 ZoneId :

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

相关问题