0

私はJava 1.7のコードの下にいます:

DateFormat df = DateFormat.getInstance();
Date startDate = df.parse("07/28/12 01:00 AM, PST");

上記の日時 (07/28/12 01:00 AM、PST) は、構成可能なプロパティ ファイルにあります。この日時がすでに過ぎている場合は、現在の日付を取得し、上記の文字列から時刻部分を設定する必要があります。これは、現在の日付の午前 01:00 PST です & この時刻もすでに過ぎている場合は、次の日を取得します &上記の文字列から時間部分を設定します。Timer オブジェクトで使用する必要があるため、最終的なオブジェクトは Date にする必要があります。

これを効率的に行うにはどうすればよいですか?日付からカレンダーに、またはその逆に変換する必要がありますか? 誰でもスニペットを提供できますか?

4

2 に答える 2

2

Calendarクラスを調べる必要があります。次のような構成を使用できます。

    Calendar cal = Calendar.getInstance();
    cal.setTime(startDate);
    cal.add(Calendar.DAY_OF_YEAR, 1);

また、現在の日付か新しい日付かを確認する方法もあります (現在の時刻を使用しますstartDate) 。before()after()

組み込みの Java 日付/時刻構造を記述しているときに、ネイティブ Java 実装よりも優れていると多くの人が考えているJoda Timeをプラグインしなければ、私は気が進まないでしょう。

編集:

と は他のオブジェクトと比較する必要があり、作成に費用がかかる可能性があるため 、Date.compareTo()プロセスの例を示す方が効率的です。Calendar.before()Calendar.after()Calendar

以下を見てください。

    DateFormat df = DateFormat.getInstance();
    Date startDate = df.parse("07/28/12 01:00 AM, PST");
    Calendar cal = Calendar.getInstance();
    cal.setTime(startDate);
    Date now = new Date();
    if (startDate.compareTo(now)< 0) {
        System.out.println("start date: " + startDate + " is before " + now);

        Calendar nowCal = Calendar.getInstance();
        nowCal.add(Calendar.DAY_OF_YEAR,1);
        cal.set(Calendar.DAY_OF_YEAR, nowCal.get(Calendar.DAY_OF_YEAR));

    } else  if (startDate.compareTo(now) == 0) {
        System.out.println("startDate: " +startDate + " is equal to " + now);
    } else {
        System.out.println("startDate: " + cal + " is after " + now);

    }
    System.out.println(cal.getTime());
于 2012-07-31T01:21:02.830 に答える
0

これでうまくいくと思います...あなたのアルゴリズムでは頭が少し回転していて、別のタイムゾーンにいるので、元の文字列は機能しませんでした:P

    try {

        DateFormat df = DateFormat.getInstance();
        Date startDate = df.parse("28/07/2012 01:00 AM");

        System.out.println("StartDate = " + startDate);

        Date callDate = startDate;

        Calendar today = Calendar.getInstance();
        Calendar start = Calendar.getInstance();
        start.setTime(startDate);

        System.out.println("Today = " + today.getTime());

        // If this date time is already passed
        // Tue Jul 31 12:18:09 EST 2012 is after Sat Jul 28 01:00:00 EST 2012
        if (today.after(start)) {

            //then I need to get the current date, set the time part from above string in the current date
            Calendar timeMatch = Calendar.getInstance();
            timeMatch.setTime(startDate);
            timeMatch.set(Calendar.DATE, today.get(Calendar.DATE));
            timeMatch.set(Calendar.MONTH, today.get(Calendar.MONTH));
            timeMatch.set(Calendar.YEAR, today.get(Calendar.YEAR));

            //& if this time is also already passed, then get the next day & set the time part from above string in it
            if (timeMatch.after(today)) {

                timeMatch.add(Calendar.DATE, 1);

            }

            callDate = timeMatch.getTime();

        }

        System.out.println("CallDate = " + callDate);

    } catch (ParseException exp) {

        exp.printStackTrace();

    }

これにより、次の出力が生成されます

StartDate = Sat Jul 28 01:00:00 EST 2012
Today = Tue Jul 31 12:18:09 EST 2012
CallDate = Tue Jul 31 01:00:00 EST 2012
于 2012-07-31T02:20:53.777 に答える