今日は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);
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
単に使用する:
c.setFirstDayOfWeek(Calendar.MONDAY);
現在、週の最初の日はCalendar.SUNDAY
に設定されています。これは、Locale
に依存する設定です。
したがって、betterの代替手段は、興味のあるCalendar
を指定してLocale
を初期化することです。
例えば:
Calendar c = GregorianCalendar.getInstance(Locale.US);
...currentの出力が得られますが、
Calendar c = GregorianCalendar.getInstance(Locale.FRANCE);
...expectedの出力が得られます。
さて、あなたは答えを得たようです。アドオンは、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);
}
}
これが、今週の開始日と終了日を取得するためにしたことです。
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();
}
特定の日付が今週に該当するかどうかを確認するために以下の方法を使用しました
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;
}
/**
* 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;
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
_など)。 EST
やIST
などの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
オブジェクトを使用します。 Year
& YearMonth
についても同じです。
_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 ) ;
_
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();
}