web-dev-qa-db-ja.com

Javaで指定された週番号の最初の日を取得する方法

自分で説明させてください。日付の週番号と年を知ることにより:

Date curr = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(curr);
int nweek = cal.WEEK_OF_YEAR;
int year = cal.YEAR;

しかし、今はその週の最初の日の日付を取得する方法がわかりません。私はカレンダー、日付、日付フォーマットを探してきましたが、役に立つものは何もありません...

なにか提案を? (Javaでの作業)

21
framara

これらのフィールドは値を返しません。これらはconstantsであり、取得/設定/追加できるCalendarオブジェクトのフィールドを識別します。希望どおりの結果を得るには、最初にCalendarを取得し、それをクリアして、既知の値を設定する必要があります。自動的に日付がその週の最初の日に設定されます。

// We know week number and year.
int week = 3;
int year = 2010;

// Get calendar, clear it and set week number and year.
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.YEAR, year);

// Now get the first day of week.
Date date = calendar.getTime();

readjavadocs を学び、classes/methods/fieldsの使用方法を学び、IDE;)

とはいえ、Java.util.DateおよびJava.util.Calendarエピックエラー です。可能であれば、 Joda Time に切り替えることを検討してください。

40
BalusC

これを試して:

public static Calendar setWeekStart(Calendar calendar) {
  while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
    calendar.add(Calendar.DATE, -1);
  }
  setDayStart(calendar); // method which sets H:M:S:ms to 0
  return calendar;
}
4
Vojta

私はJava=で多くの日付のことをしていませんが、解決策は次のとおりです:

cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK));

論理:

曜日を取得し、それを現在の日付から減算します(月曜日が週の最初の日か日曜日である必要があるかどうかによって、-1が必要になる場合があります)。

2
Morfildur

さらに別の方法...

_    GregorianCalendar cal = new GregorianCalendar();
    cal.clearTime();
    Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK)
    cal.add(Calendar.DATE, correction);
_

calは今週の最初の日です

1-cal.get(GregorianCalendar.DAY_OF_WEEK)

日曜日の場合は1-1(私のロケールでは週の最初の曜日)、月曜日の場合は1-2と評価されます。これにより、時計を日曜日に戻すために必要な修正が得られます

1
chim

グレゴリオ暦アルゴリズムを試してください:

public int getFirstDay(int m, int year)
    {
        int k=1;
        int c, y, w, M=0;
        if(m>2 && m<=12) M=m-2;
        else if(m>0 && M<=2)
        {
            M=m+10;
            year-=1;
        }
        c=year/100;
        y=year%100;
        w=(int)((k+(Math.floor(2.6*M - 0.2))-2*c+y+(Math.floor(y/4))+(Math.floor(c/4)))%7);//a fantastic formula           
        if(w<0) w+=7;
        return w;//thus the day of the week is obtained!
    }
0
NovoBook

これらに注意してください。calendar.get(Calendar.WEEK_OF_YEAR)は、12月の終わりであり、すでに翌年に終わる週である場合、1を返します。

使用する

//            cal2.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR));
//            cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

cal2の日付を次のように設定します。 2009年12月29日2009年末!!

私はこれを使いました:

cal2.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR)); //to round at the start of day
cal2.set(Calendar.YEAR, cal.get(Calendar.YEAR));
cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //to round at the start of week

また、カレンダーの週が、どのロケールにあるかに関係なく、月曜日から始まることも確認します。

cal.setFirstDayOfWeek(Calendar.MONDAY);
cal2.setFirstDayOfWeek(Calendar.MONDAY);
0
MarianP

これを行うための簡単で汚いコードを次に示します。このコードは、現在の日付でカレンダーオブジェクトを作成し、現在の曜日を計算し、曜日を減算して、最初の曜日(日曜日)にします。私はDAY_OF_YEARを使用していますが、それは何年にもわたって行きます(1/2/10にそれは正しい12/27/09を返します)。

import Java.text.Format;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;
import Java.util.Date;


public class DOW {

    public static void main(String[] args) {
        DOW dow = new DOW();
        dow.doIt();
        System.exit(0);
    }

    private void doIt() {
        Date curr = new Date(); 
        Calendar cal = Calendar.getInstance(); 
        cal.setTime(curr); 
        int currentDOW = cal.get(Calendar.DAY_OF_WEEK);
        cal.add(Calendar.DAY_OF_YEAR, (currentDOW * -1)+1);

        Format formatter = new SimpleDateFormat("MM/dd/yy");
        System.out.println("First day of week="+formatter.format(cal.getTime()));
    }
}
0
SOA Nerd