有没有办法检查 javaDate
对象是否是星期一?我看到你可以用一个Calendar
对象,但是日期?如果星期一的索引会改变,我也会使用美国东部日期和时间
5 回答
像这样的东西会起作用:
Calendar cal = Calendar.getInstance();
cal.setTime(theDate);
boolean monday = cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY;
您可以使用Calendar
对象。
使用setTime(date)将日期设置为日历对象
例子:
calObj.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
编辑:正如 Jon Skeet 建议的那样,您需要将 TimeZone 设置为 Calendar 对象,以确保它适用于时区。
如果没有两个额外的信息,这个问题就没有意义:一个时区和一个日历系统。
一个Date
对象只代表一个瞬间。在我所在的时区,它恰好是公历中的星期三——但对于我东边的一些人来说,已经是星期四了。在其他日历系统中,甚至可能没有“星期一”等这样的概念。
日历系统部分可能不是问题,但您需要确定您感兴趣的时区。
然后,您可以创建一个Calendar
对象并设置时区和表示的瞬间——或者,更好的是,您可以使用Joda Time,它是一个更好的日期/时间 API。您仍然需要考虑相同的问题,但您的代码会更清晰。
您应该使用 Calendar 对象进行这些检查。日期的时区支持较弱。在一个时区,此日期可以是星期一,而在另一个时区,它仍然是星期日。
java.time
java.util
日期时间 API 及其格式化 API已SimpleDateFormat
过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *。
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用java.time
现代日期时间 API 的解决方案:
用来Instant
表示片刻:
Instant instant = Instant.now();
System.out.println(instant); // A sample output: 2021-07-03T09:07:37.984Z
An代表UTCInstant
时间线上的一个瞬时点。输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定时区(时区偏移量为小时)。Z
Etc/UTC
+00:00
但是,如果您有 的对象java.util.Date
,请将其转换为Instant
例如
Date date = new Date(); // A sample date
Instant instant = date.toInstant();
转换Instant
为ZonedDateTime
在您的时区中表示日期时间,例如
ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));
检查日期时间是否在星期一,例如
System.out.println(zdt.getDayOfWeek() == DayOfWeek.SUNDAY);
演示:
import static java.time.DayOfWeek.SUNDAY;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.now();
ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));
System.out.println(zdt.getDayOfWeek() == SUNDAY);
}
}
输出:
false
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。