に、現在の時間内に特定の範囲の時間を現在の日のJava
質問
この頃になった1000時間1000異なるところがございます。問題は知りたい場合があり/標準/高速チェックする場合は現在"時間"と時間の値 hh:mm:ss
形式です。例えば、私の大きなビジネスロジックはないと 18:00:00 and 18:30:00
.こうした点にご留意ください。
public static boolean isCurrentTimeBetween(String starthhmmss, String endhhmmss) throws ParseException{
DateFormat hhmmssFormat = new SimpleDateFormat("yyyyMMddhh:mm:ss");
Date now = new Date();
String yyyMMdd = hhmmssFormat.format(now).substring(0, 8);
return(hhmmssFormat.parse(yyyMMdd+starthhmmss).before(now) &&
hhmmssFormat.parse(yyyMMdd+endhhmmss).after(now));
}
例試験の場合:
String doNotRunBetween="18:00:00,18:30:00";//read from props file
String[] hhmmss = downTime.split(",");
if(isCurrentTimeBetween(hhmmss[0], hhmmss[1])){
System.out.println("NOT OK TO RUN");
}else{
System.out.println("OK TO RUN");
}
僕が求めているのは、コードでより良い
- 性能
- に見え
- 正確性を
僕が求めてはいません
- サードパーティーのライブラリ
- 例外処理の議論
- 変数名の命名規約
- 法と修飾子の問題
解決
これは、あなたがする必要がある必要があり、すべて、この方法は、大まかに入力して高コヒーレントから結合されます。
boolean isNowBetweenDateTime(final Date s, final Date e)
{
final Date now = new Date();
return now.after(s) && now.before(e);
}
どのように開始と終了の日付オブジェクトを取得することは、それらを比較することとは無関係です。あなたは周りのString
表現を渡すとする必要があるよりも、物事は道より複雑になっている。
ここで再び緩やかに結合し、高コヒーレント、開始日と終了日を取得するための良い方法です。
private Date dateFromHourMinSec(final String hhmmss)
{
if (hhmmss.matches("^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$"))
{
final String[] hms = hhmmss.split(":");
final GregorianCalendar gc = new GregorianCalendar();
gc.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hms[0]));
gc.set(Calendar.MINUTE, Integer.parseInt(hms[1]));
gc.set(Calendar.SECOND, Integer.parseInt(hms[2]));
gc.set(Calendar.MILLISECOND, 0);
return gc.getTime();
}
else
{
throw new IllegalArgumentException(hhmmss + " is not a valid time, expecting HH:MM:SS format");
}
}
これはかなり自己文書化されます2つのよく名前のメソッドの呼び出しを行うことができます。
他のヒント
、ファジーロリポップの正規表現は午後2時と19時00分の間の時間をピックアップしません。
フル24時制を一致させる取得するには、あなたがこれを使用することができます:
if (hhmmss.matches("^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"))
{
// Do stuff here
}
以下のクラスは、私はちょうど他の回答からのコードの一部から作成ものです。これは、特定の日に関係なしに「期間」の振る舞いをカプセル化します。私たちのシステムは、現在の時刻は、当社指定のメンテナンスウィンドウの1以内であるかどうかをチェックするために、このクラスを使用しています。すなわち、五時00分00秒 - 7時00分○○秒
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
*
* @author Adam Yocum
*/
public class ExclusionTimePeriod {
private String timeStart;
private String timeEnd;
/**
* @return the timeStart
*/
public String getTimeStart() {
return timeStart;
}
/**
* @param timeStart the timeStart to set
*/
public void setTimeStart(String timeStart) {
if (timeStart.matches("^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"))
{
this.timeStart = timeStart;
}
else
{
throw new IllegalArgumentException(timeStart + " is not a valid time, expecting HH:MM:SS format");
}
}
/**
* @return the timeEnd
*/
public String getTimeEnd() {
return timeEnd;
}
/**
* @param timeEnd the timeEnd to set
*/
public void setTimeEnd(String timeEnd) {
if (timeEnd.matches("^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"))
{
this.timeEnd = timeEnd;
}
else
{
throw new IllegalArgumentException(timeEnd + " is not a valid time, expecting HH:MM:SS format");
}
}
private Date toDate(String hhmmss){
final String[] hms = hhmmss.split(":");
final GregorianCalendar gc = new GregorianCalendar();
gc.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hms[0]));
gc.set(Calendar.MINUTE, Integer.parseInt(hms[1]));
gc.set(Calendar.SECOND, Integer.parseInt(hms[2]));
gc.set(Calendar.MILLISECOND, 0);
Date date = gc.getTime();
return date;
}
public boolean isNowInPeriod()
{
final Date now = new Date();
return now.after(toDate(getTimeStart())) && now.before(toDate(getTimeEnd()));
}
public static void main(String[] args){
//Test All possible hours
for(int hour=0;hour<=23;hour++){
String hourStr = "";
if(hour<=9){
hourStr = "0"+hour;
}else{
hourStr = ""+hour;
}
for(int min=0;min<60;min++){
String minStr = "";
if(min<=9){
minStr = "0"+min;
}else{
minStr = ""+min;
}
for(int sec=0;sec<60;sec++){
String secStr = "";
if(sec<=9){
secStr = "0"+sec;
}else{
secStr = ""+sec;
}
String hhmmss = hourStr+":"+minStr+":"+secStr;
ExclusionTimePeriod period = new ExclusionTimePeriod();
period.setTimeStart(hhmmss);
period.setTimeEnd(hhmmss);
System.out.println(hhmmss+" Ok");
}
}
}
//Test isInPeriod functionality
ExclusionTimePeriod isInTest = new ExclusionTimePeriod();
isInTest.setTimeStart("10:00:00");
isInTest.setTimeEnd("10:43:00");
System.out.println((new Date())+" is between "+isInTest.getTimeStart()+" and "+isInTest.getTimeEnd()+" = "+isInTest.isNowInPeriod());
}
}
dateFromHourMinSec方法が書かれたとして欠陥があります。それはseconde桁が3以上である任意の時間、例えばを許可しません。 18時00分○○秒。あなたは[0-2] [0-9]許可するように変更した場合には、そのような29:00:00倍にできるようになります。 そのための修正をお持ちですか?
tl;dr
LocalTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
.toLocalTime() ;
Boolean isBetween = ( ! now.isBefore( LocalTime.of( 18 , 0 ) ) // "not before" means "is equal to OR after".
&&
now.isBefore( LocalTime.of( 18 , 30 ) ) ; // Half-Open, beginning is *inclusive* while ending is *exclusive*.
をjava.時間
ご利用の古い日付-時間の授業として実績を重ねていく、く、十分な注意が必要です。今もその レガシー,supplantedのjava.時間ます。
LocalTime
など、単なる文字列を表す時間値です。このタイプの LocalTime
クラスです。
LocalTime start = LocalTime.of( 18 , 0 );
LocalTime stop = LocalTime.of( 18 , 30 );
それに合格したインスタンスへのユーティリティメソッド.このメソッドはしてはならないものとしまず、解析する必要がなくなるための構文解析例外です。
public static boolean isCurrentTimeBetween( LocalTime start , LocalTime stop ) {
…
ZonedDateTime
タイムゾーンが行われることが重要である現在の日付および時間温調節器もあります。任意の瞬間は、日曜日、世界中によります。例えば、数分後夜 パリフランス 新日を"昨日に" モントリオールケベック.
指定 適切なタイムゾーン名 の形式の continent/region
, など America/Montreal
, Africa/Casablanca
, や Pacific/Auckland
.は絶対に使わないでください3-4文字の省略形など EST
または IST
としてい ない trueの時間帯は標準化されなくなるかもしれない"世界をリードするユニークな!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( z );
を比較する時間の現在、この抽出 LocalTime
その ZonedDateTime
.しかし、問題の異常などのサマータイムDST)や政治家の再定義からタイムゾーンを通過しています。きない場合がありませ午後6時の時間特定日です。の溶液にこの難問によって異なりビジネスとビジネスルールまずは無視し難問に貼れば、現在の時間の間標的の開始-停止ます。または適用できる時間帯を開始-停止時の日の昼ましょう ZonedDateTime
クラス調整できること。見てみましょう両方のアプローチ。
無視し異常
最初に、な異常が発生した場合の対お願いだとは文字通りこの日間が対象の開始と停止時の温調節器もあります。
ることができ、時間のオブジェクトの潜日付/時刻オブジェクトです。
LocalTime localTimeNow = zdt.toLocalTime(); // Extract a time-of-day from the zoned date-time object.
を比較することを当社の停止-開始時の温調節器もあります。ことがありますのでご了承はこちらをご利用の開いたアプローチを定義しました。このアプローチのはじまりです 包括的 が終了する 専用.このアプローチで一般的な日時や仕事が一般的でのかかるものと思われます。
Boolean isNowOnOrAfterStart = ( ! localTimeNow.isBefore( start ) ) ; // A briefer way of asking "is equal to OR is after" is "is not before".
Boolean isNowBeforeStop = localTimeNow.isBefore( stop );
Boolean isNowInTargetZone = ( isNowOnOrAfterStart && isNowBeforeStop ); // Half-Open: beginning is inclusive while ending is exclusive.
異常の検討
次のいず異常が発生した場合の対また、開始と停止時の日に現在の日付のタイムゾーンになります。を抽出して、日付のみからな防衛能力日付/時刻オブジェクトです。
LocalDate localDateToday = zdt.toLocalDate();
ZonedDateTime zdtStart = ZonedDateTime.of( localDateToday , start , z );
ZonedDateTime zdtStop = ZonedDateTime.of( localDateToday , stop , z );
研究クラスの文書の挙動を把握する ZonedDateTime.of
解決の無効な時間値です。が完全なものはあり得ないことからを解決するうえで存在しない時間価値観は、決定する必要がある場合このクラスの道をいれることでお客様のビジネスのルールに
ZonedDateTime.の
public static ZonedDateTime of(LocalDate date, LocalTime time, ZoneId zone)
取得したインスタンスのZonedDateTimeから地元の日時。このゾー日程-時間のマッチングの入力地域としての日付と時間に密接などが可能です。タイムゾーンルールなどの夏時間が使われるということであるわけではありません現地の日付-時間の有効期限は、指定されたゾーンでは、このように、現地の日付-時間を調整します。
地元の日時に、最初の形を組み合わせ現地の日付です。地元の日時を決議し、一瞬の時間。この発見、有効なUTCからのオフセット/グリニッジ-ヴィレッジのため、現地の日付-時間として定義されたルールのゾーンのIDです。
ほとんどの場合、ある有効なオフセットのための地方の日付ます。の場合には重なり、時計は、有効なオフセットなのです。この方法は、以前のオフセットは、通常、対応する"にあたる。
の場合にはギャップ、時計の飛躍が有効とを相殺するものとする。その代わりに、地元の日時に調整され、後の長さによる。のための典型的な一時間の夏時間の変更により、現地の日付-時間の移動の一時間後のオフセットは、通常、対応する"にあたる。
同じ比較論した。
Boolean isNowOnOrAfterStart = ( ! zdt.isBefore( zdtStart ) ) ; // A briefer way of asking "is equal to OR is after" is "is not before".
Boolean isNowBeforeStop = zdt.isBefore( zdtStop );
Boolean isNowInTargetZone = ( isNowOnOrAfterStart && isNowBeforeStop ); // Half-Open: beginning is inclusive while ending is exclusive.
代替方法の比較の利用が便利 Interval
クラスからのThreeTen-追加ます。スク以外のリスクにつきは痛みの Instant
オブジェクトでの抽出から ZonedDateTime
オブジェクト。の Instant
クラスはこのタイムラインに 世界標準時間 分解能 ナノ秒 (9桁の小数).
Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
Boolean isNowInTargetZone = interval.contains( zdt.toInstant() );
約java.時間
の java.時間 枠組みがJava8以降である。これらのクラスsupplantの面倒古 レガシー 日付-時間の授業など java.util.Date
, Calendar
, & SimpleDateFormat
.
の Joda-時間 プロジェクトは、 メンテナンスモード,助言への移行 java.時間 ます。
詳細は、 Oracleのチュートリアル.検索スタックオーバーフローのための多くの例で説明しています。仕様 JSR310.
入手先のjava.時間の授業で
- Java SE8 や SE9 以降
- ですのでお問い合わせ下さい。
- 一部の標準のJava APIでは、同梱の実装です。
- Java9を追加し若干の特徴と問題を修正
- Java SE6 や SE7
- 多くのjava.時間の機能はバに移植されるJava6&7 ThreeTen-Backport.
- Android
- の ThreeTenABP プロジェクトに対応 ThreeTen-Backport (上記)Android注目する必要があると主張した。
- 見 使い方ThreeTenABP....
の ThreeTenインストール プロジェクトextends java.時間を追加します。このプロジェクトには、立地のためには、将来的な追加java.ます。すべての授業などはこちら Interval
, YearWeek
, YearQuarter
, は、 以上.