一天的开始几点,比如说01/01/2010?
是00:00:00:000?还是那个午夜?
[编辑]
这可能是一个愚蠢的问题,但我很困惑,因为我使用Calendar.set(Calendar.HOUR,0),但这给了我一个12:00:00的时间。
现在我意识到我应该使用HOUR_OF_DAY
答案 0 :(得分:9)
一天的开始并不总是午夜。它可以取决于时区和日期。 (如果时钟在一天开始时向前移动一小时,它将在凌晨1点开始。)
这就是Joda-Time有LocalDate.toDateTimeAtStartOfDay
之类的原因 - 而且值得使用。
但是,通常它是在00:00:00,即午夜。 (这也可以格式化为“12am”,具体取决于您的语言环境等。)
答案 1 :(得分:2)
通常,日期的开始时间为 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 desugaring 和 How to use ThreeTenABP in Android Project。
答案 2 :(得分:1)
就像 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
类的设计很差并且已经过时了,所以您不必担心;只是不要再使用那个类了。
Calendar.HOUR
。