【发布时间】:2011-11-01 07:02:59
【问题描述】:
在 Java 日历中存在方法集。例如。现在是 2011 年 1 月 11 日。如果我们像这样:
Calendar now = new GregorianCalendar();
now.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
日历将设置为最近的星期五,但日期比现在多。 如果总是去更大的日期,在文档中什么也不写。 有人可以确认吗? 谢谢。
【问题讨论】:
在 Java 日历中存在方法集。例如。现在是 2011 年 1 月 11 日。如果我们像这样:
Calendar now = new GregorianCalendar();
now.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
日历将设置为最近的星期五,但日期比现在多。 如果总是去更大的日期,在文档中什么也不写。 有人可以确认吗? 谢谢。
【问题讨论】:
它总是将其设置为同一周内给定的星期几。一周的第一天取决于日历和地区。
例如,在我的英国机器上使用默认日历,星期一是一周的第一天 - 因此将星期几设置为今天会导致 10 月 31 日,而将星期几设置为星期日会导致11 月 6 日。但是,如果我使用:
Calendar now = Calendar.getInstance(Locale.US);
now.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
System.out.println(now.getTime());
...那么一周的第一天是星期日,结果是 10 月 30 日。
您可以使用setFirstDayOfWeek 明确设置一周的第一天。
【讨论】:
该方法会将日历设置为“本周”的星期五。是在过去还是将来,取决于您目前在本周的哪个位置。这也是一个依赖于语言环境的调用,因为一周的第一天可能会根据您所在的位置而有所不同。
【讨论】:
java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
使用现代日期时间 API java.time 的解决方案:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
// Replace JVM's ZoneId, ZoneId.systemDefault() with the applicable one e.g.
// ZoneId.of("America/Los_Angeles")
LocalDate today = LocalDate.now(ZoneId.systemDefault());
// Next Sunday
LocalDate nextSun = today.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(nextSun);
// Same (if it's Sunday today) of next Sunday
LocalDate sameOrNextSun = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println(sameOrNextSun);
// Previous Sunday
LocalDate previousSun = today.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY));
System.out.println(previousSun);
// Same (if it's Sunday today) of previous Sunday
LocalDate sameOrPreviousSun = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
System.out.println(sameOrPreviousSun);
}
}
样本运行的输出:
2021-07-25
2021-07-18
2021-07-11
2021-07-18
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 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。
【讨论】: