获取特定周的日期

Get Date of Specific Week

我正在尝试获取一个月中特定一周的开始和结束日期。但是日期不正确。任何人都可以找出问题所在吗?

public class DateUtils
{
   getWeeklyDateList(2020,5, 3);

  public static void getWeeklyDateList(int year, int month, int week)
  {
      Calendar calendar = Calendar.getInstance(Locale.getDefault());
      // setting year, month, week
      calendar.set(Calendar.YEAR, year);
      calendar.set(Calendar.MONTH, month);
      calendar.set(Calendar.WEEK_OF_MONTH,week);

    // setting day of week to first --> Sunday
    calendar.set(Calendar.DAY_OF_WEEK, 1);

    int year1 = calendar.get(Calendar.YEAR);
    int month1 = calendar.get(Calendar.MONTH);
    int day1 = calendar.get(Calendar.DAY_OF_MONTH);

    // setting day of week to last --> Saturday
    calendar.set(Calendar.DAY_OF_WEEK, 7);

    int year7 = calendar.get(Calendar.YEAR);
    int month7 = calendar.get(Calendar.MONTH);
    int day7 = calendar.get(Calendar.DAY_OF_MONTH);

    Log.e("date_start", String.valueOf(year1) + "-" + String.valueOf(month1) + "-" + String.valueOf(day1));
    Log.e("date_end", String.valueOf(year7) + "-" + String.valueOf(month7) + "-" + String.valueOf(day7));
} }

就是因为这条线, calendar.set(Calendar.DAY_OF_WEEK, 1);

如果一周从上一周开始,这可能需要一个月才能回到上一个月。如果有一个月的差异那就是问题所在。

java.time 和 ThreeTenABP

如果你想使用 java.time,现代 Java 日期和时间 API,可以用这个简单的方法来完成:

private static WeekFields wf = WeekFields.of(Locale.forLanguageTag("ne-NP"));

public static void getWeeklyDateList(int year, Month month, int week) {
    LocalDate someDateInTheWeek = LocalDate.of(year, month, 10).with(wf.weekOfMonth(), week);
    LocalDate start = someDateInTheWeek.with(wf.dayOfWeek(), 1);
    LocalDate end = someDateInTheWeek.with(wf.dayOfWeek(), 7);

    System.out.println("date_start: " + start);
    System.out.println("date_end:   " + end);
}

使用您的示例参数进行尝试:

    getWeeklyDateList(2020, Month.JUNE, 3);

输出为:

date_start: 2020-06-14
date_end:   2020-06-20

工作原理:

首先,不同文化对周的定义不同。在尼泊尔(因为您将尼泊尔的加德满都作为您的位置),星期从星期日开始,并且以每月的第一周在该月的第一周的方式进行编号。为了处理本周计划,我正在为尼泊尔文化初始化一个 WeekFields 对象。

LocalDate 是没有时间的日期的 java.time class。我认为选择一个月中的哪一天作为起点并不重要;我拿了第10个。从那个日期开始,我使用 WeekFields 对象和提供的周数在正确的星期得到一个日期。从那里我依次得到一周的第一天和最后一天,再次根据尼泊尔对周的定义:从 2020 年 6 月 14 日星期日到 6 月 20 日星期六。

我不知道你的代码出了什么问题。无论如何,您使用的 Calendar class 设计不佳且早已过时。它还默认使用 JVM 的默认语言环境作为其周定义,这可能为您提供了与您想要的不同的周方案。最后一点可能让您感到困惑:Calendar 不自然地从 0 表示一月到 11 表示十二月。因此,当您指定 5 时,您得到的是 6 月(而不是 5 月)。您打印了结果日期的月份数字,六月可能再次打印了 5(而不是 6)。

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接) .
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接