134

Java で時間のリセットに問題があります。特定の日付について、時間を00:00:00に設定したいと思います。

これは私のコードです:

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }

問題は、時間が12:00:00ある場合とそうである場合が00:00:00あり、データベースに保存されたエンティティと、保存され07.02.2013 00:00:00ている実際のエンティティ時間をクエリすると12:00:00、クエリが失敗することです。

私はそれを知ってい12:00:00 == 00:00:00ます!

私はAppEngineを使用しています。これは appengine のバグ、問題、またはその他の問題ですか? それとも何か他のものに依存していますか?

4

15 に答える 15

233

の代わりに別の定数を使用しCalendar.HOURてくださいCalendar.HOUR_OF_DAY

calendar.set(Calendar.HOUR_OF_DAY, 0);

Calendar.HOURは 0 ~ 11 (AM/PM で使用) をCalendar.HOUR_OF_DAY使用し、0 ~ 23 を使用します。

Javadoc を引用するには:

public static final int HOUR

午前または午後の時間を示す get および set のフィールド番号。HOUR は 12 時間時計 (0 から 11) に使用されます。正午と真夜中は、12 ではなく 0 で表されます。たとえば、10:04:15.250 PM の HOUR は 10 です。

public static final int HOUR_OF_DAY

時刻を示す get および set のフィールド番号。HOUR_OF_DAY は 24 時間時計に使用されます。たとえば、午後 10:04:15.250 の HOUR_OF_DAY は 22 です。

テスト中 (「現在」は現在、2013 年 7 月 23 日太平洋夏時間の 14:55 頃です):

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}

出力:

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00
于 2013-07-23T21:45:23.570 に答える
37

java.time

java.timeJava 8 以降に組み込まれているフレームワークを使用する。チュートリアルを参照してください。

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

時刻 (時、分、秒などの部分) が必要ない場合は、LocalDateclass の使用を検討してください。

LocalDate.now(); # 2015-11-19
于 2015-11-19T18:54:23.490 に答える
1

これを行う方が簡単かもしれません(Java 8の場合)

LocalTime.ofNanoOfDay(0)
于 2017-02-28T13:40:08.413 に答える
0

これを行う別の方法は、秒なしで DateFormat を使用することです。

public static Date trim(Date date) {
    DateFormat format = new SimpleDateFormat("dd.MM.yyyy");
    Date trimmed = null;
    try {
        trimmed = format.parse(format.format(date));
    } catch (ParseException e) {} // will never happen
    return trimmed;
}
于 2015-08-20T09:46:19.957 に答える