2016-07-27 4 views
1

今日の00:00 AMと明日の00:00 AMを計算する必要があります。どのように私は与えられた瞬間から2つのミッドナイトを得ることができますか?

私はこの

private static void some(final Date now) { 
    final Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(now); 
    calendar.set(Calendar.MILLISECOND, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    final Date min = calendar.getTime(); // 00:00 AM of today 
    calendar.add(Calendar.DATE, 1); 
    final Date max = calendar.getTime(); // 00:00 AM of tomorrow 
} 

を好きにしようとしているが、これを行うための任意のよりよい(あるいは単に他の)方法はありますか?

+0

java time API(java 8)を使用できますか? – assylias

+0

@assyliasはい! –

+0

@JinKwonローカルタイムゾーンで真夜中をしたいですか? UTCで? – assylias

答えて

3

あなたがしようとしていることにはいくつか問題があります。

まず、「今日」は、Dateの明確な概念ではありません。 Dateは基本的にUnixエポックからのミリ秒数の周りだけのラッパーです:。その瞬間に対応するカレンダーの日付は、あなたがしているどのタイムゾーンに応じて、異なる

例えば、new Date(1469584693000)によって表される瞬間が2016-07-にありましたロンドンの27しかしそれはNYCの2016-07-26にあった。

もちろん、JVMのデフォルトのタイムゾーンを使用できますが、これによりコードの動作がJVMの設定に依存します。

第2に、「真夜中」は常に存在するものではありません。 Asia/Gazaのタイムゾーンでは、夏時間が午前0時に開始されます。つまり、時計は1日の23:59:59から次の時刻の01:00:00にジャンプします(Ideone demo参照)。このため、Java 8の時間APIにはではなくatStartOfDayというメソッドがあります。

だから、あなたは、Javaの8で、一緒にこれを置くことができます。もちろん

private static void some(final Date now, ZoneId zone) { 
    Instant instant = now.toInstant(); // Convert from old legacy class to modern java.time class. 
    ZonedDateTime zdt = instant.atZone(zone); // Apply a time zone to the UTC value. 
    LocalDate today = zdt.toLocalDate(); // Extract a date-only value, without time-of-day and without time zone. 

    ZonedDateTime startOfDayToday = today.atStartOfDay(zone); // Determine first moment of the day. 
    ZonedDateTime startOfDayTomorrow = today.plusDays(1).atStartOfDay(zone); 

    // ... 
} 

、あなたは直接法にInstantまたはZonedDateTimeに渡すことができます。明示的な定数ZoneIdを使用することができます。 ZoneId.of("UTC")

関連する問題