web-dev-qa-db-ja.com

Java-(月曜日から日曜日)で現在の週の開始日と終了日を取得する

今日は2014-04-06(日曜日)です。

以下のコードを使用して得られる出力は次のとおりです。

Start Date = 2014-04-07
End Date = 2014-04-13

これは、代わりに取得したい出力です:

Start Date = 2014-03-31
End Date = 2014-04-06

どうすればこれを達成できますか?

これは私がこれまでに完了したコードです。

// Get calendar set to current date and time
Calendar c = GregorianCalendar.getInstance();

System.out.println("Current week = " + Calendar.DAY_OF_WEEK);

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Current week = " + Calendar.DAY_OF_WEEK);

// Print dates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
String startDate = "", endDate = "";

startDate = df.format(c.getTime());
c.add(Calendar.DATE, 6);
endDate = df.format(c.getTime());

System.out.println("Start Date = " + startDate);
System.out.println("End Date = " + endDate);
18
Scorpion

Java 8を使用して回答を更新

Java 8を使用し、以前と同じ原則を維持します(週の最初の日はLocaleに依存します)、次の使用を検討する必要があります。

特定のDayOfWeekの最初と最後のLocaleを取得します

final DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
final DayOfWeek lastDayOfWeek = DayOfWeek.of(((firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1);

今週の最初と最後の日のクエリ

LocalDate.now(/* tz */).with(TemporalAdjusters.previousOrSame(firstDayOfWeek)); // first day
LocalDate.now(/* tz */).with(TemporalAdjusters.nextOrSame(lastDayOfWeek));      // last day

デモンストレーション

次のclassを考慮してください。

private static class ThisLocalizedWeek {

    // Try and always specify the time zone you're working with
    private final static ZoneId TZ = ZoneId.of("Pacific/Auckland");

    private final Locale locale;
    private final DayOfWeek firstDayOfWeek;
    private final DayOfWeek lastDayOfWeek;

    public ThisLocalizedWeek(final Locale locale) {
        this.locale = locale;
        this.firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
        this.lastDayOfWeek = DayOfWeek.of(((this.firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1);
    }

    public LocalDate getFirstDay() {
        return LocalDate.now(TZ).with(TemporalAdjusters.previousOrSame(this.firstDayOfWeek));
    }

    public LocalDate getLastDay() {
        return LocalDate.now(TZ).with(TemporalAdjusters.nextOrSame(this.lastDayOfWeek));
    }

    @Override
    public String toString() {
        return String.format(   "The %s week starts on %s and ends on %s",
                                this.locale.getDisplayName(),
                                this.firstDayOfWeek,
                                this.lastDayOfWeek);
    }
}

次のように使用方法を示すことができます。

final ThisLocalizedWeek usWeek = new ThisLocalizedWeek(Locale.US);
System.out.println(usWeek);
// The English (United States) week starts on SUNDAY and ends on SATURDAY
System.out.println(usWeek.getFirstDay()); // 2018-01-14
System.out.println(usWeek.getLastDay());  // 2018-01-20

final ThisLocalizedWeek frenchWeek = new ThisLocalizedWeek(Locale.FRANCE);
System.out.println(frenchWeek);
// The French (France) week starts on MONDAY and ends on SUNDAY
System.out.println(frenchWeek.getFirstDay()); // 2018-01-15
System.out.println(frenchWeek.getLastDay());  // 2018-01-21

元のJava 7回答(期限切れ)

単に使用する:

c.setFirstDayOfWeek(Calendar.MONDAY);

説明:

現在、週の最初の日Calendar.SUNDAYに設定されています。これは、Localeに依存する設定です。

したがって、betterの代替手段は、興味のあるCalendarを指定してLocaleを初期化することです。
例えば:

Calendar c = GregorianCalendar.getInstance(Locale.US);

...currentの出力が得られますが、

Calendar c = GregorianCalendar.getInstance(Locale.FRANCE);

...expectedの出力が得られます。

24
ccjmne

さて、あなたは答えを得たようです。アドオンは、Java 8以降で Java.time を使用して( チュートリアル

import Java.time.DayOfWeek;
import Java.time.LocalDate;

public class MondaySunday
{
  public static void main(String[] args)
  {
    LocalDate today = LocalDate.now();

    // Go backward to get Monday
    LocalDate monday = today;
    while (monday.getDayOfWeek() != DayOfWeek.MONDAY)
    {
      monday = monday.minusDays(1);
    }

    // Go forward to get Sunday
    LocalDate sunday = today;
    while (sunday.getDayOfWeek() != DayOfWeek.SUNDAY)
    {
      sunday = sunday.plusDays(1);
    }

    System.out.println("Today: " + today);
    System.out.println("Monday of the Week: " + monday);
    System.out.println("Sunday of the Week: " + sunday);
  }
}

時間調整器 を使用する別の方法。

import Java.time.LocalDate;

import static Java.time.DayOfWeek.MONDAY;
import static Java.time.DayOfWeek.SUNDAY;
import static Java.time.temporal.TemporalAdjusters.nextOrSame;
import static Java.time.temporal.TemporalAdjusters.previousOrSame;

public class MondaySunday
{
  public static void main(String[] args)
  {
    LocalDate today = LocalDate.now();

    LocalDate monday = today.with(previousOrSame(MONDAY));
    LocalDate sunday = today.with(nextOrSame(SUNDAY));

    System.out.println("Today: " + today);
    System.out.println("Monday of the Week: " + monday);
    System.out.println("Sunday of the Week: " + sunday);
  }
}
14
Aman Agnihotri

これが、今週の開始日と終了日を取得するためにしたことです。

public static Date getWeekStartDate() {
    Calendar calendar = Calendar.getInstance();
    while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        calendar.add(Calendar.DATE, -1);
    }
    return calendar.getTime();
}

public static Date getWeekEndDate() {
    Calendar calendar = Calendar.getInstance();
    while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        calendar.add(Calendar.DATE, 1);
    }
    calendar.add(Calendar.DATE, -1);
    return calendar.getTime();
}
2
Shrikant

特定の日付が今週に該当するかどうかを確認するために以下の方法を使用しました

public boolean isDateInCurrentWeek(Date date) 
{
        Date currentWeekStart, currentWeekEnd;

        Calendar currentCalendar = Calendar.getInstance();
        currentCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        while(currentCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY)
        {
            currentCalendar.add(Calendar.DATE,-1);//go one day before
        }
        currentWeekStart = currentCalendar.getTime();

        currentCalendar.add(Calendar.DATE, 6); //add 6 days after Monday
        currentWeekEnd = currentCalendar.getTime();

        Calendar targetCalendar = Calendar.getInstance();
        targetCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        targetCalendar.setTime(date);


        Calendar tempCal = Calendar.getInstance();
        tempCal.setTime(currentWeekStart);

        boolean result = false;
        while(!(tempCal.getTime().after(currentWeekEnd)))
        {
            if(tempCal.get(Calendar.DAY_OF_YEAR)==targetCalendar.get(Calendar.DAY_OF_YEAR))
            {
                result=true;
                break;
            }
            tempCal.add(Calendar.DATE,1);//advance date by 1
        }

        return result;
    }
0
Dev
/**
 * Get the date of the first day in the week of the provided date
 * @param date A date in the interested week
 * @return The date of the first week day
 */
public static Date getWeekStartDate(Date date){
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_WEEK, getFirstWeekDay());
    return cal.getTime();
}

/**
 * Get the date of the last day in the week of the provided date
 * @param date A date in the interested week
 * @return The date of the last week day
 */
public static Date getWeekEndDate(Date date){
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DATE, 6);// last day of week
    return cal.getTime();
}

Date now = new Date(); // any date
Date weekStartDate = getWeekStartDate(now);
Date weekEndDate = getWeekEndDate(now);

// if you don't want the end date to be in the future
if(weekEndDate.after(now))
    weekEndDate = now;
0
Islam Assi

tl; dr

ThreeTen-Extraライブラリの便利なYearWeekクラスを使用して、1週間全体を表します。次に、その週内の曜日の日付を決定するよう依頼します。

_org.threeten.extra.YearWeek          // Handy class representing a standard ISO 8601 week. Class found in the *ThreeTen-Extra* project, led by the same man as led JSR 310 and the *Java.time* implementation.
.now(                                // Get the current week as seen in the wall-clock time used by the people of a certain region (a time zone). 
    ZoneId.of( "America/Chicago" ) 
)                                    // Returns a `YearWeek` object.
.atDay(                              // Determine the date for a certain day within that week.
    DayOfWeek.MONDAY                 // Use the `Java.time.DayOfWeek` enum to specify which day-of-week.
)                                    // Returns a `LocalDate` object.
_

LocalDate

LocalDate クラスは、時刻および タイムゾーン または offset-from-UTC なしの日付のみの値を表します。

タイムゾーンは、日付を決定する上で重要です。どのような場合でも、日付はゾーンごとに世界中で異なります。たとえば、 Paris France の真夜中から数分後は新しい日で、 MontréalQuébec の「昨日」のままです。

タイムゾーンが指定されていない場合、JVMは現在のデフォルトのタイムゾーンを暗黙的に適用します。そのデフォルトは、 いつでも変更される可能性があります ランタイム(!)中に、結果が異なる場合があります。希望する/予想されるタイムゾーンを引数として明示的に指定する方が適切です。重大な場合は、ユーザーにゾーンを確認してください。

適切なタイムゾーン名 を_Continent/Region_の形式で指定します(_America/Montreal_、_Africa/Casablanca_、_Pacific/Auckland_など)。 ESTISTなどの2-4文字の略語をそのまま使用しないでくださいnot真のタイムゾーンであり、標準化されておらず、一意(!).

_ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;
_

JVMの現在のデフォルトのタイムゾーンを使用する場合は、それを要求し、引数として渡します。省略した場合、コードを読むと曖昧になり、デフォルトを使用するつもりなのか、多くのプログラマーのように問題に気付いていないのかは確実にわかりません。

_ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
_

または、日付を指定します。月を数字で設定することができます。1月から12月までは1から12までの番号が付けられます。

_LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
_

または、 Month 年ごとに1つずつ事前定義されたenumオブジェクトを使用することをお勧めします。ヒント:コードをより自己文書化し、有効な値を確保し、 タイプセーフ を提供するには、単なる整数ではなくコードベース全体でこれらのMonthオブジェクトを使用します。 YearYearMonth についても同じです。

_LocalDate ld = LocalDate.of( 2014 , Month.APRIL , 6 ) ;
_

YearWeek

月曜日から日曜日までの週の定義は、 ISO 8601 標準の定義と一致します。

ThreeTen-Extra ライブラリをプロジェクトに追加して、標準週を表す YearWeek クラスにアクセスします。

_YearWeek week = YearWeek.from( ld ) ;  // Determine the week of a certain date.
_

または今日の週を取得します。

_YearWeek week = YearWeek.now( z ) ;
_

曜日の日付を取得します。 DayOfWeek enumを使用して、曜日を指定します。

_LocalDate firstOfWeek = week.atDay( DayOfWeek.MONDAY ) ;
LocalDate lastOfWeek = week.atDay( DayOfWeek.SUNDAY ) ;
_
0
Basil Bourque
Calendar privCalendar = Calendar.getInstance();
Date fdow, ldow;
int dayofWeek = privCalendar.get ( Calendar.DAY_OF_WEEK );
Date fdow, ldow;

                    if( dayofWeek == Calendar.SUNDAY ) {

                        privCalendar.add ( Calendar.DATE, -1 * (dayofWeek -
                                Calendar.MONDAY ) - 7 );

                        fdow = privCalendar.getTime();

                        privCalendar.add( Calendar.DATE, 6 );

                        ldow = privCalendar.getTime();
                    } else {

                        privCalendar.add ( Calendar.DATE, -1 * (dayofWeek -
                                Calendar.MONDAY ) );

                        fdow = privCalendar.getTime();

                        privCalendar.add( Calendar.DATE, 6 );

                        ldow = privCalendar.getTime();
                    }
0
K1TS