簡體   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