2009-05-19 9 views

答えて

90

あなたが最小/最大は

Date a, b; // assume these are set to something 
Date d;  // the date in question 

return a.compareTo(d) * d.compareTo(b) > 0; 

値の順序がわからない場合は、範囲はここ

return a.compareTo(d) * d.compareTo(b) >= 0; 
+18

動作しますが、読み込みはできません。とにかくありがとう。 –

+1

@BrunoDeFreitasBarros「読み込み不可」とはどういう意味ですか? –

+1

@Peter Lawrey Brunoは、コメントなしでコードを理解することは難しいことを意味します。 – Mirimas

36

ので、同様:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

あなたがの感覚からエンドポイントを除外する>の代わりに、>=、代わりに<=<を使用することができます「との間に。」

+0

ご連絡ありがとうございます。 –

+1

これは必ずしも機能しません。私はDateオブジェクトに対してcompareToを使用する際に問題がありました。 2006年1月1日は私のプログラムの1つで、2006年4月1日の後に明らかでした。 – KitsuneYMG

+0

@KitsuneYMG:次のコードを試して、期待どおりに動作しています: 'Date date1 = new Date(2006、1、1); // 2006年1月1日日付date2 =新しい日付(2006、4、1); // 2006年4月1日System.out.println(date1.compareTo(date2)); // -1 System.out.println(date2.compareTo(date1)); // 1 'となる。あなたは*あなたのために働いていないことをここで分かち合うことができますか? – Gnanam

212

これはもう少し読みやすいかもしれません:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.after(min) && d.before(max); 
+1

非常に健全な9秒の速さ、サー。 –

+42

の間にエンドポイントを含めることができます。この場合、return!d.before(min)&&!d.after(max);を使用できます。 –

+1

@Tetsujin no Oni申し訳ありませんが、良いことは、私は大きな助成金を持っていません。 :) –

2

あなたはgetTime()を使用して、返された長いUTC値を比較することができます。

編集する場合は、1970年以前の日付に対処する必要はありません、その場合どのように動作するかわからない。

8

別のオプション

min.getTime() <= d.getTime() && d.getTime() <= max.getTime() 
2

あなたは、日付/時刻を扱うための本当に良いAPIであるJoda Timeを見てみたいことがあります。あなたの現在の質問への解決のために本当にそれを必要としないのであれば、将来あなたの苦痛を救うために縛られています。

+1

はい私はすぐにジョーダの時間を提案することでしたが、API内で「範囲内」テストをサポートするものは何も表示されません。誰か? – dukedave

+1

私はこの特定の問題のためにJodaを提案していません。すでに多数のソリューションがあるからです。 – willcodejavaforfood

+1

しかし、これを行うためにJoda時間にIntervalを作成します。 – willcodejavaforfood

2
import java.util.Date; 

public class IsDateBetween { 

public static void main (String[] args) { 

      IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date 
} 
public IsDateBetween(String dd) { 

     long from=Date.parse("01/01/2000"); // From some date 

     long to=Date.parse("12/12/2010");  // To Some Date 

     long check=Date.parse(dd); 

     int x=0; 

     if((check-from)>0 && (to-check)>0) 
     { 
      x=1; 
     } 

System.out.println ("From Date is greater Than ToDate : "+x); 
} 

} 
+1

これは美しいコードです。これは私が今までに見た中で最も優れた機能の1つです。それは私をたくさん助けました。ありがとうございました! – Bassiuz

1

包括的になりたい場合は、あなたが行く:

public static void main(String[] args) throws ParseException { 

     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

     String oeStartDateStr = "04/01/"; 
     String oeEndDateStr = "11/14/"; 

     Calendar cal = Calendar.getInstance(); 
     Integer year = cal.get(Calendar.YEAR); 

     oeStartDateStr = oeStartDateStr.concat(year.toString()); 
     oeEndDateStr = oeEndDateStr.concat(year.toString()); 

     Date startDate = sdf.parse(oeStartDateStr); 
     Date endDate = sdf.parse(oeEndDateStr); 
     Date d = new Date(); 
     String currDt = sdf.format(d); 


     if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){ 
      System.out.println("Date is between 1st april to 14th nov..."); 
     } 
     else{ 
      System.out.println("Date is not between 1st april to 14th nov..."); 
     } 
    } 
10

ここでは、を使用してこれを行う方法がいくつかあります2.3ライブラリ。

一方の方法は、DateTimeインスタンスの単純なisBeforeisAfterメソッドを使用することです。ちなみに、Joda-TimeのDateTimeは、概念上、java.util.Date(宇宙のタイムライン上の瞬間)と似ていますが、タイムゾーンを含んでいます。

もう1つの方法は、Joda-Timeで間隔を作成することです。 containsメソッドは、指定されたDateTimeがIntervalでカバーされる期間内に発生するかどうかをテストします。インターバルの開始は包括的ですが、エンドポイントは排他的です。このアプローチは、記号「[)」の「ハーフオープン」として知られています。

次のコード例の両方の方法を参照してください。

java.util.DateインスタンスをJoda-Time DateTimeインスタンスに変換します。単にDateインスタンスをDateTimeのコンストラクタに渡します。実際には、JVMのデフォルトのタイムゾーンに頼るのではなく、特定のDateTimeZoneオブジェクトも渡す必要があります。代わりに、コンソールにisAfter/isBefore ...

Interval interval = new Interval(dateTime1, dateTime3); 
boolean intervalContainsDateTime2 = interval.contains(dateTime2); 

ダンプの間隔アプローチを使用する前に/後...

boolean is1After2 = dateTime1.isAfter(dateTime2); 
boolean is2Before3 = dateTime2.isBefore(dateTime3); 

boolean is2Between1And3 = ((dateTime2.isAfter(dateTime1)) && (dateTime2.isBefore(dateTime3))); 

のためにテストすることにより、比較

DateTime dateTime1 = new DateTime(new java.util.Date()).minusWeeks(1); 
DateTime dateTime2 = new DateTime(new java.util.Date()); 
DateTime dateTime3 = new DateTime(new java.util.Date()).plusWeeks(1); 

...

System.out.println("DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1); 
System.out.println("is1After2 " + is1After2); 
System.out.println("is2Before3 " + is2Before3); 
System.out.println("is2Between1And3 " + is2Between1And3); 
System.out.println("intervalContainsDateTime2 " + intervalContainsDateTime2); 

実行時...

DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 
is1After2 false 
is2Before3 true 
is2Between1And3 true 
intervalContainsDateTime2 true 
2

ここで今日は2ヶ月の間にあるかどうかを見つける方法は次のとおりです。

private boolean isTodayBetween(int from, int to) { 
    if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) { 
     throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to); 
    } 
    Date now = new Date(); 
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setTime(now); 
    int thisMonth = cal.get(Calendar.MONTH); 
    if (from > to) { 
     to = to + Calendar.DECEMBER; 
     thisMonth = thisMonth + Calendar.DECEMBER; 
    } 
    if (thisMonth >= from && thisMonth <= to) { 
     return true; 
    } 
    return false; 
} 

と同じようにそれを呼び出す:エンドポイントを含む日付の間

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH) 
1

public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){ 
    return !(date.before(min) || date.after(max)); 
} 
のように記述することができます
関連する問題