私には今の時間があります:
new Date();
そして、私はいくつかの時間定数を持っています、例えば、23と8(午後11時または23:00、午前8時または08:00です)。どうすれば2時間の定数の間の時間になりましたか?
たとえば、現在2時間の間にある場合は、プログラムのコードを実行するか、実行しない必要があります。たとえば、すでに夕方で朝でない場合は、一部のコードを実行しないでください。
ここで説明する画像:
サイレントモードが起動しない状況:
00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!
23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!
01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
これを試して
int from = 2300;
int to = 800;
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date()); //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8) // Check if hour is between 8 am and 11pm
{
// do whatever you want
}
現代的な方法は、Java 8以降に組み込まれたJava.timeクラスを使用することです。機能の多くは、Java 6&7 ThreeTen-Backportプロジェクト、さらにAndroid ThreeTenABPプロジェクトに適応).
ここではタイムゾーンが重要です。特定の瞬間において、日付と時刻は両方とも世界中でゾーンごとに異なります。
ZoneId z = ZoneId.of( "America/Montreal" );
あなたの現在の瞬間を取得します。
ZonedDateTime zdt = ZonedDateTime.now( z );
時刻を抽出します。名前のLocal
部分は、オブジェクト内に含まれるタイムゾーンのno概念があることを意味します。
LocalTime lt = zdt.toLocalTime();
夕方の限界を定義します。
LocalTime start = LocalTime.of( 23 , 0 ); // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 ); // 8 AM.
比較。
新しい日をまたいでいるのか、同じ日をまたいでいるのかを把握する必要があります。 LocalTime
には日付の概念がなく、24時間の一般的な1日のみです。したがって、ケースごとに異なる比較アルゴリズムが必要なため、開始が停止の前か後かをテストする必要があります。開始と終了が等しいかどうかを検討する必要があります。これは、ビジネスルールによっては特別な場合があるためです。
日時作業では、通常、時間の範囲をハーフオープンとして定義します。ここで、開始はinclusiveで、終了はexclusive。
これを行う1つの方法を次に示します。
Boolean silentRunning = null ;
if( start.equals( stop ) ) {
silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) { // Example 3 PM to 6 PM.
silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) { // Example 11 PM to 8 AM.
silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
// Error. Should not reach this point. Paranoid check.
}
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは現在 maintenance mode であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeクラスはどこで入手できますか?
更新:上記は、この回答の新しいバージョンです。以下は古いです。
Joda-Timeライブラリは、日時の作業に関して、Java.util.Dateおよび.Calendarクラスよりもはるかに優れています。
時間帯は、時刻を決定するために重要です。明らかに、「今」はモントリオールよりもパリでの一日の終わりです。
時間の範囲を定義することは、通常、ハーフオープン、[)
、ここで、開始は包括的ですが、終了は排他的です。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23 ) && ( hour < 8 ) );
これはよりクリーンな解決策であり、うまくいくと思います。さまざまな時間パラメーターでテストしました。
/**
* @param fromHour Start Time
* @param toHour Stop Time
* @param now Current Time
* @return true if Current Time is between fromHour and toHour
*/
boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
//Start Time
Calendar from = Calendar.getInstance();
from.set(Calendar.HOUR_OF_DAY, fromHour);
from.set(Calendar.MINUTE, 0);
//Stop Time
Calendar to = Calendar.getInstance();
to.set(Calendar.HOUR_OF_DAY, toHour);
to.set(Calendar.MINUTE, 0);
if(to.before(from)) {
if (now.after(to)) to.add(Calendar.DATE, 1);
else from.add(Calendar.DATE, -1);
}
return now.after(from) && now.before(to);
}
チュートリアルを見ることができます ここ with Date.before
そしてDate.after
また、ミリ秒を取得して比較することもできます。
これは、現在(現在の時間)が1から4の間であるかどうかをチェックする関数ですOR 4から8 OR 8から12 OR 12から16 OR 16から20 OR 20から1そして、次の正確な時間を返します。
private Calendar GetTimeDiff() throws ParseException {
Calendar now = Calendar.getInstance();
Calendar one = Calendar.getInstance();
one.set(Calendar.HOUR_OF_DAY, 1);
one.set(Calendar.MINUTE, 0);
one.set(Calendar.SECOND, 0);
Calendar four = Calendar.getInstance();
four.set(Calendar.HOUR_OF_DAY, 4);
four.set(Calendar.MINUTE, 0);
four.set(Calendar.SECOND, 0);
Calendar eight = Calendar.getInstance();
eight.set(Calendar.HOUR_OF_DAY, 8);
eight.set(Calendar.MINUTE, 0);
eight.set(Calendar.SECOND, 0);
Calendar twelve = Calendar.getInstance();
twelve.set(Calendar.HOUR_OF_DAY, 12);
twelve.set(Calendar.MINUTE, 0);
twelve.set(Calendar.SECOND, 0);
Calendar sixteen = Calendar.getInstance();
sixteen.set(Calendar.HOUR_OF_DAY, 16);
sixteen.set(Calendar.MINUTE, 0);
sixteen.set(Calendar.SECOND, 0);
Calendar twenty = Calendar.getInstance();
twenty.set(Calendar.HOUR_OF_DAY, 20);
twenty.set(Calendar.MINUTE, 0);
twenty.set(Calendar.SECOND, 0);
if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {
return four;
}
if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {
return eight;
}
if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {
return twelve;
}
if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {
return sixteen;
}
if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {
return twenty;
}
if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {
return one;
}
return now;
}