7

私の入力は「from」/「to」構造ですが、日付の配列を取得しようとしています。だから私の入力は次のとおりです。

String date1 = "2014-01-01";
String date2 = "2014-05-01";

私の出力は、date1 と date2 の間のすべての日付を含む Arraylist である必要があります。私はすでにこれを探しましたが、2つの日付の違いに関する質問しか見つかりませんでした:

SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
String inputString1 = "23 01 1997";
String inputString2 = "27 04 1997";

try {
    Date date1 = myFormat.parse(inputString1);
    Date date2 = myFormat.parse(inputString2);
    long diff = date2.getTime() - date1.getTime();
    System.out.println ("Days: " + TimeUnit.DAYS.convert(diff,TimeUnit.MILLISECONDS));
} catch (ParseException e) {
e.printStackTrace();
}

ヒントや提案はありますか?他のすべての質問は、iOS または SQL に関するものです。

4

6 に答える 6

4

JodaTime を見てみましょう: http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html

DateTime dateTime1 = new DateTime(date1);
DateTime dateTime2 = new DateTime(date2);

List<Date> allDates = new ArrayList();

while( dateTime1.before(dateTime2) ){
   allDates.add( dateTime1.toDate() );
   dateTime1 = dateTime1.plusDays(1);
}
于 2015-09-03T09:59:15.627 に答える
1

私は JodaTime が好きですが、これはサードパーティのライブラリがなくても を使用して実行できますjava.util.Calendar。オブジェクトが与えられたCalendar場合、そのaddメソッドを使用して、カレンダーの規則を尊重しながら日付の特定のフィールドを増やすことができます (1 月 31 日に 1 日を追加すると、1 月 32 日ではなく 2 月 1 日になります)。

最初にCalendar、正しい時系列順に日付を 1 つのオブジェクトにそれぞれ取得するため、追加は後で正しい方向に進みます。

    Calendar cStart = Calendar.getInstance(),
             cStop = Calendar.getInstance();

    if (date1.before(date2)) {
        cStart.setTime(date1);
        cStop.setTime(date2);
    } else {
        cStart.setTime(date2);
        cStop.setTime(date1);

date1簡単にするために、質問からdate2解析されたオブジェクトです。Date

次に、停止日を超えるまで、「年間通算日に 1 を追加する」命令をループします。

do {
        System.out.println(pretty(cStart));
        cStart.add(Calendar.DAY_OF_YEAR, 1);
} while (cStart.before(cStop));

そして最後に停止日を出力します

    System.out.println(pretty(cStop));

pretty()最初に文字列を解析するために使用したもののように、SDF を介してカレンダーを送信する小さなメソッドです。

このソリューションは、開始日と終了日を含む日付範囲を出力し、エッジ ケース (のようなdate1==date2) を微調整する必要がある場合があります。開始日と終了日を除外するように簡単に調整できます。もちろん、印刷は集約と交換できます。カレンダーから Date オブジェクトを取得するには、getTime()メソッドを使用します (ライブ参照ではなく、スナップショットを返します)。

関連するドキュメントは、ここ(Gregorian)Calendarにあります。

于 2015-09-03T10:15:30.520 に答える
1

サードパーティのライブラリを使用したくない場合は、次を使用できますCalendar

ここで動作するデモを確認してください。

public static void main(String[] args) throws Exception {
    SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
    String inputString1 = "23 01 1997";
    String inputString2 = "27 04 1997";
    ArrayList<Date> dates = new ArrayList<Date>();

    try {
        Date date1 = myFormat.parse(inputString1);
        Calendar c1 = DateToCalendar(date1);
        Date date2 = myFormat.parse(inputString2);
        Calendar c2 = DateToCalendar(date2);

        while (!areEqualDate(c1, c2)) {
            dates.add(c1.getTime());
            System.out.println (c1.getTime());
            c1.add(Calendar.DAY_OF_YEAR, 1);
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }


    // ArrayList<Date> dates >> contain all dates between both given days.
}


private static boolean areEqualDate(Calendar c1, Calendar c2) {
    if (c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR)) return false; 
    if (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH)) return false; 
    if (c1.get(Calendar.DAY_OF_YEAR) != c2.get(Calendar.DAY_OF_YEAR)) return false; 
    return true;
}

public static Calendar DateToCalendar(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return cal;
}
于 2015-09-03T10:07:49.830 に答える