获取特定星期的日期

时间:2020-05-25 12:24:13

标签: java android calendar

我正在尝试获取一个月中特定星期的开始和结束日期。但是日期不正确。谁能找出问题所在?

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));
} }

2 个答案:

答案 0 :(得分:3)

java.time和ThreeTenABP

如果要使用现代Java日期和时间API java.time,可以通过以下简单方法完成:

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

工作原理:

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

LocalDate是不带日期的日期的java.time类。我认为选择哪个月份作为起点并不重要;我拿了第十名。从该日期起,我使用WeekFields对象和提供的星期编号来获得正确的星期中的日期。依次根据尼泊尔对周的定义,从那里依次到达一周的第一天和最后一天:从2020年6月14日星期日到2020年6月20日星期六。

我无法分辨出您的代码出了什么问题。无论如何,您使用的Calendar类的设计都不好,而且已经过时了。它还默认使用JVM的默认语言环境作为其周定义,这可能为您提供了与所需的不同的周方案。最后一点可能使您感到困惑:Calendar不自然地将月份从1月的0到12月的11进行了编号。因此,当您指定5时,您将获得6月(而不是5月)。您已打印出结果日期的月份号,可能会在6月再次打印5(而非6)。

问题:java.time是否不需要Android API级别26?

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

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

链接

答案 1 :(得分:0)

由于这一行, calendar.set(Calendar.DAY_OF_WEEK,1);

如果一周从上一个月开始,则这可能需要一个月到上个月。如果相差一个月,那就是问题所在。

相关问题