在java中,什么时候开始一天?

时间:2010-01-02 18:18:12

标签: java date time

一天的开始几点,比如说01/01/2010?

是00:00:00:000?还是那个午夜?

[编辑]

这可能是一个愚蠢的问题,但我很困惑,因为我使用Calendar.set(Calendar.HOUR,0),但这给了我一个12:00:00的时间。

现在我意识到我应该使用HOUR_OF_DAY

3 个答案:

答案 0 :(得分:9)

一天的开始并不总是午夜。它可以取决于时区和日期。 (如果时钟在一天开始时向前移动一小时,它将在凌晨1点开始。)

这就是Joda-TimeLocalDate.toDateTimeAtStartOfDay之类的原因 - 而且值得使用。

但是,通常它是在00:00:00,即午夜。 (这也可以格式化为“12am”,具体取决于您的语言环境等。)

答案 1 :(得分:2)

java.time

通常,日期的开始时间为 00:00 小时,但可能会因 DST 而有所不同。因此,最安全的选择是使用 LocalDate#atStartOfDay(ZoneId zone),而不是假设它是 00:00 小时。

演示:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/u", Locale.ENGLISH);
        LocalDate date = LocalDate.parse("01/01/2010", dtf);

        // In JVM's timezone
        ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
        System.out.println(startOfDay);

        // In custom timezone
        startOfDay = date.atStartOfDay(ZoneId.of("Africa/Johannesburg"));
        System.out.println(startOfDay);
    }
}

输出:

2010-01-01T00:00Z[Europe/London]
2010-01-01T00:00+02:00[Africa/Johannesburg]

modern date-time API 中了解有关 Trail: Date Time* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 2 :(得分:1)

来自 java.time 的 ZonedDateTime

就像 Arvind Kumar Avinash 已经在一个很好的答案中所做的那样,我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。

如果您有一个 LocalDate 或一个包含没有时间的日期的字符串,那么该答案将向您展示如何获取一天的开始(一天的第一时刻)。如果您已经有一个 ZonedDateTime,您可以简单地使用它的 truncatedTo 方法。让我们举一个有趣的例子,其中时钟在 00:00 向前转动,因此一天中的第一个时刻是 01:00:

    ZonedDateTime zdt = ZonedDateTime.of(
            2000, 9, 17, 15, 45, 56, 789000000, ZoneId.of("Asia/Dili"));
    System.out.println("We got date and time: " + zdt);

    ZonedDateTime startOfDay = zdt.truncatedTo(ChronoUnit.DAYS);
    System.out.println("Start of day is:      " + startOfDay);

输出:

<块引用>
We got date and time: 2000-09-17T15:45:56.789+09:00[Asia/Dili]
Start of day is:      2000-09-17T01:00+09:00[Asia/Dili]

您的代码出了什么问题?

您已经在对该问题的编辑中说过了,但它也值得在答案中提及:Calendar.HOUR 指的是,来自文档:

<块引用>

get 和 set 的字段编号,指示早上或 下午。 HOUR 用于 12 小时制 (0 - 11)。 ……

因此,如果您的 Calendar 已经在下午(中午 12 点或更晚)保持时间,则将 HOUR 设置为 0 将为您提供中午 12 点(24 小时制的 12:00),而不是午夜 12 点(24 小时制 00:00)。除了小时的时间可能仍然是非零的,所以你也可能得到,例如,12:34:45.567。 Calendar 类使用起来很麻烦。

无论如何,Calendar 类的设计很差并且已经过时了,所以您不必担心;只是不要再使用那个类了。

链接