繁体   English   中英

获取特定周的日期

[英]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));
} }

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

使用您的示例 arguments 进行尝试:

    getWeeklyDateList(2020, Month.JUNE, 3);

Output 是:

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

这个怎么运作:

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

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

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

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

java.time 适用于较旧和较新的 Android 设备。 它只需要至少Java 6

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

链接

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM