2013-07-23 9 views
76

Javaで時間をリセットする際に問題があります。特定の日付については、時間を00:00:00に設定したいと思います。時間を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のバグですか、問題なのでしょうか?それともそれは別のものに依存していますか?

+0

は、この異なるロケールとは何かを持っているだろうか、これは、同じPCからのすべての時間が起こるのでしょうか? – LostBoy

+0

私はappengineにデプロイするときに起こります。 – Adelin

+0

時間をカットするための他の多くのソリューション:http://stackoverflow.com/a/1908955/2646526 – heenenee

答えて

130

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

calendar.set(Calendar.HOUR_OF_DAY, 0); 

Calendar.HOUR(AM/PMで使用するため)0-11を使用し、Calendar.HOUR_OF_DAYは0-23を使用します。午前または午後の 時間を示す取得および設定のための

のpublic static final int型HOUR

フィールド番号:Javadocを引用する

。 HOURは、12時間の クロック(0〜11)に使用されます。 04:15.250 PM HOURは10です

のpublic static final int型HOUR_OF_DAY

フィールド正午から深夜0によってではなく、10時12 例えば、で表​​されます番号を取得し、時刻を示す を設定します。 HOUR_OF_DAYは、24時間の クロックに使用されます。例えば、10時:04:

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())); 
    } 
} 

出力:15.250 PM HOUR_OF_DAYは22

テストです(。 "今" 2013年7月23日太平洋夏時間に現在C 14:55です) :

$ javac Main.java 
$ java Main 
2013-07-23 12:00:00 
2013-07-23 00:00:00 
+3

@JarrodRobersonしかし、 'Calendar.HOUR'を使うとPMをAMに設定することはできず、12時の正午となります。 – rgettman

+0

LocalDateの構築に時間、分、秒でお手伝いできますか?私は1つのオプションがDateTimeに従うことを知っています。 – Woody

+6

HOURとHOUR_OF_DAYのフィールドを作成した人は誰でも鞭打って配給をしていたはずです。 – AndroidDev

9

ここでは、これを行うために使用する2つのユーティリティ関数を示します。

/** 
* sets all the time related fields to ZERO! 
* 
* @param date 
* 
* @return Date with hours, minutes, seconds and ms set to ZERO! 
*/ 
public static Date zeroTime(final Date date) 
{ 
    return DateTimeUtil.setTime(date, 0, 0, 0, 0); 
} 

/** 
* Set the time of the given Date 
* 
* @param date 
* @param hourOfDay 
* @param minute 
* @param second 
* @param ms 
* 
* @return new instance of java.util.Date with the time set 
*/ 
public static Date setTime(final Date date, final int hourOfDay, final int minute, final int second, final int ms) 
{ 
    final GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTime(date); 
    gc.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    gc.set(Calendar.MINUTE, minute); 
    gc.set(Calendar.SECOND, second); 
    gc.set(Calendar.MILLISECOND, ms); 
    return gc.getTime(); 
} 
0

任意の秒なしにDateFormatを使用することですこれを行う別の方法:後でのJava 8とに組み込まれjava.timeフレームワークを使用して

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; 
} 
12

java.time

Tutorialを参照してください。

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 

あなたは時間帯を必要としない場合は(時、分、秒などの部品は)LocalDateクラスを使用することを検討してください。

LocalDate.now(); # 2015-11-19 
+0

この質問は最初に尋ねられて以来、Java 1.8がリリースされて以来、これは新しい承認された回答になるはずです。 –

1

これを実行する可能性がより簡単に

LocalTime.ofNanoOfDay(0) 
+0

ありがとうございました、私は他のものと2年以上前に仕事をしていました。私は今、Javaに戻ってきました(Groovyでいくつかの作業をしてから)、Java 8の違いが好きです。 – meszias

2

つ以上JAVA 8の方法(Javaの8で):

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS); 

しかし、それはすでに存在して日付を編集するために多くの便利です。

3

あなたは考え、より良い、主に設定された時間帯に、このようなDateFormatのコンポーネントへ:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

次にあなたがフォーマッタ0ミリ秒を渡すことで、「午前0時00分○○秒」の時間を取得することができます:

String time = dateFormat.format(0); 

か、Dateオブジェクトを作成することができます

Date date = new Date(0); // also pass milliseconds 
String time = dateFormat.foramt(date); 

をしたり、使用してより多くの可能性を持つことができますカレンダーコンポーネントができますが、インスタンスをカレンダーへGMTとタイムゾーンを設定する必要があります。

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); 
calendar.set(Calendar.HOUR_OF_DAY, 5); 
calendar.set(Calendar.MINUTE, 37); 
calendar.set(Calendar.SECOND, 27); 

dateFormat.format(calendar.getTime()); 
関連する問題