0

使用在日历中设置日期字段

    myCalender.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);

是否将日期设置为下一个星期五或过去的星期五或最近的星期五?

另外,如果我没有为日历设置年份或任何其他字段怎么办,默认值是什么?

4

4 回答 4

2

两者都不。然而。情况很复杂。但不要使用Calendar,见下文。

两个参数set方法的文档中:

将给定的日历字段设置为给定的值。该方法不解释该值...</p>

因此,在此调用期间,它只是将星期几字段设置为星期五。年、月、日保持不变,也就是说,日期没有有效地改变。然而。

如果Calendar最终计算并解析其字段,

如果日历字段值有任何冲突,Calendar则优先考虑最近设置的日历字段。以下是日历字段的默认组合。将使用由最近设置的单个字段确定的最近组合。

如果您只设置了星期几(这可能会与其他字段发生冲突),则适用以下组合:

YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK

所以它会选择同一周的星期五。

定义一周的内容由Calendar的 first-day-of-week 字段决定。它的初始值是由的语言环境决定的,你可以通过和Calendar来控制它。这反过来意味着先前设置为星期日的欧洲语言环境中的 a 的默认行为将返回到上一个星期五,而美国语言环境中的 a 将选择下一个星期五。getFirstDayOfWeek()setFirstDayOfWeek()CalendarCalendar

如果您在设置星期几之后但在计算字段之前还设置了其他字段,情况就不同了。

默认值?

通常,字段的默认值是CalendarJVM 时区中的当前日期和时间(通常但不总是与设备的时区相同)。

你不需要关心

好消息是你不需要关心。无论如何,该类Calendar早已过时,而且(回想起来)它的设计也很糟糕,所以你不应该使用它。而是使用java.time现代 Java 日期和时间 API。与它一起工作要好得多。根据您的需要,您可以例如使用LocalDate日期或ZonedDateTime带有时区的日期和时间。

现代课程为您提供了更好的清晰度和更大的灵活性。例如:

    LocalDate ld = LocalDate.now(ZoneId.of("Pacific/Saipan"));

    // the following calls do what the method names say
    ld = ld.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
    ld = ld.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
    ld = ld.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
    ld = ld.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));

    // set to Friday in the same ISO week
    ld = ld.with(ChronoField.DAY_OF_WEEK, DayOfWeek.FRIDAY.getValue());

    // set to Friday in the same US week
    ld = ld.with(WeekFields.SUNDAY_START.dayOfWeek(), 
            DayOfWeek.FRIDAY.get(WeekFields.SUNDAY_START.dayOfWeek()));

问题:我可以java.time在安卓上使用吗?

是的,java.time在 Android 设备上运行良好。它只需要至少Java 6

  • 在 Java 8 及更高版本以及新的 Android 设备上(据我所知,从 API 级别 26 开始)新的 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,新类的后向端口(ThreeTen 用于 JSR 310,现代 API 首次被描述的地方)。
  • 在(较旧的)Android 上,使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。org.threeten.bp确保从包和子包中导入日期和时间类。

链接

于 2018-02-21T23:36:57.797 回答
0

事实证明,使用 myCalender.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY) 是一团糟,它可能将日期设置为下一个或过去的星期五,我已经尝试了很多但无法弄清楚逻辑!

无论如何,我所需要的只是将日历设置为下周的特定日期,我设法使用该问题的答案来做到这一点..

将日历设置为下周四

于 2018-02-28T05:25:22.023 回答
0

下周五

2018 年 2 月 23 日星期五,20:44:17.353

默认值为今年

于 2018-02-21T20:47:22.943 回答
0

什么是默认值

 Calendar rightNow = Calendar.getInstance(); //the default is the current time/date

下周五或过去的周五或最近的周五?

下一次/日期,因此,答案是下周五。

文档

于 2018-02-21T20:53:57.877 回答