【问题标题】:Does set of java Calendar always go to future date?一组java日历是否总是去未来的日期?
【发布时间】:2011-11-01 07:02:59
【问题描述】:

在 Java 日历中存在方法集。例如。现在是 2011 年 1 月 11 日。如果我们像这样:

Calendar now = new GregorianCalendar();

now.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);

日历将设置为最近的星期五,但日期比现在多。 如果总是去更大的日期,在文档中什么也不写。 有人可以确认吗? 谢谢。

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

    它总是将其设置为同一周内给定的星期几。一周的第一天取决于日历和地区。

    例如,在我的英国机器上使用默认日历,星期一是一周的第一天 - 因此将星期几设置为今天会导致 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 明确设置一周的第一天。

    【讨论】:

      【解决方案2】:

      该方法会将日历设置为“本周”的星期五。是在过去还是将来,取决于您目前在本周的哪个位置。这也是一个依赖于语言环境的调用,因为一周的第一天可能会根据您所在的位置而有所不同。

      【讨论】:

        【解决方案3】:

        java.time

        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
        

        ONLINE DEMO

        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 desugaringHow to use ThreeTenABP in Android Project

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-31
          • 2023-03-07
          • 2014-10-22
          • 1970-01-01
          相关资源
          最近更新 更多