時間部分なしで2つの日付を比較する方法は?


203

java.util.Dateの時刻部分を無視するcompareToメソッドが必要です。これを解決する方法はいくつかあると思います。最も簡単な方法は何ですか?

回答:


212

更新:当時はJoda Timeがお勧めでしたjava.timeが、可能であればJava 8以降のライブラリを使用してください。


私の好みはこれを信じられないほど簡単にするJoda Timeを使うことです:

DateTime first = ...;
DateTime second = ...;

LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();

return firstDate.compareTo(secondDate);

編集:コメントに記載されているように、使用するDateTimeComparator.getDateOnlyInstance()とさらに簡単になります:)

// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

(「使用ジョダ時間」について尋ねほぼすべてのSOの質問の基礎であるjava.util.Datejava.util.Calendar。それは徹底的に優れたAPIです。あなたがやっている場合は何も日付/時刻と有意にあなたは、おそらくことができる場合は、あなたが実際にそれを使用する必要があります。)

あなたは絶対にしている場合は強制的に APIに建て使用するには、インスタンスの作成する必要がありCalendar、適切な日付とし、適切なタイムゾーンを使用します。次に、各カレンダーの各フィールドを時間、分、秒、ミリ秒から0に設定し、結果の時間を比較します。Jodaソリューションと比較して間違いなくひどいです:)

タイムゾーンの部分が重要ですjava.util.Dateされ、常に UTCに基づきます。私が日付に興味を持っていたほとんどの場合、それは特定のタイムゾーンの日付でした。それ自体で、CalendarまたはJoda Time を使用することを強制します(タイムゾーンを自分で説明したい場合を除きますが、これはお勧めしません)。

Android開発者向けクイックリファレンス

//Add joda library dependency to your build.gradle file
dependencies {
     ...
     implementation 'joda-time:joda-time:2.9.9'
}

サンプルコード(例)

DateTimeComparator dateTimeComparator = DateTimeComparator.getDateOnlyInstance();

Date myDateOne = ...;
Date myDateTwo = ...;

int retVal = dateTimeComparator.compare(myDateOne, myDateTwo);

if(retVal == 0)
   //both dates are equal
else if(retVal < 0)
   //myDateOne is before myDateTwo
else if(retVal > 0)
   //myDateOne is after myDateTwo

28
Jonが言うように「Use Joda Time」はjava.util.Dateまたはjava.util.Calendarについて尋ねるほとんどすべてのSO質問の基礎ですが、私は常に最初にユーザーの質問に基づいて具体的な答えを出すのが最善だと常に思っています。少なくとも、Javaの方法を実行するのがいかに難しいかを示すためです。そしてその後、
Jodaの

13
@JuanZe:そのためには、痛みを伴うAPIで何かを適切に行う方法を正確に検討する必要があります。私はむしろより生産的な何かをするためにその時間を使いたいです:)
Jon Skeet

1
@ MetroidFan2002:LocalDateは、表現力が高いため、DateMidnightよりも優れたオプションです。すべての曜日に真夜中があるわけではありません...
Jon Skeet

2
@dertoni:確かに-ブラジルでは、夏時間のために時計が進むとき、それはその日の初めに発生します...したがって、時計は23:59:58、23:59:59、01:00を読み取ります。 :00、01:00:01など
ジョンスキート

8
それは使用する方ではないでしょうDateTimeComparator.getDateOnlyInstance()
エミル

125

Apache commons-langはほとんどどこにでもあります。これはどうですか?

if (DateUtils.isSameDay(date1, date2)) {
    // it's same
} else if (date1.before(date2)) {
   // it's before
} else {
   // it's after
}


2
悲しいことにnullの日付は許容されません
Pavel Niedoba

Guysは、今日では、Java 8持たstackoverflow.com/a/35411693/259237
アンドレ・

最初または2番目のDateオブジェクトがTimestampから放映されてマイル秒があり、もう1つが通常のDateオブジェクトである場合、Datestampからの日付が別の部分に格納されるため、この方法の使用はお勧めしません。オブジェクトのミリ秒は、両方の日付が等しい場合でも違いを与えます。
Zini

残念ながら、Apacheは13億台を超えるAndroidデバイスに搭載されているわけではなく、1つのユースケースのみに依存する巨大なライブラリです。私は何か他のものが必要になります:/
milosmns

58

本当にjava.util.Dateを使用したい場合は、次のようにします。

public class TimeIgnoringComparator implements Comparator<Date> {
  public int compare(Date d1, Date d2) {
    if (d1.getYear() != d2.getYear()) 
        return d1.getYear() - d2.getYear();
    if (d1.getMonth() != d2.getMonth()) 
        return d1.getMonth() - d2.getMonth();
    return d1.getDate() - d2.getDate();
  }
}

または、代わりにカレンダーを使用します(getYear()などが非推奨であるため推奨)

public class TimeIgnoringComparator implements Comparator<Calendar> {
  public int compare(Calendar c1, Calendar c2) {
    if (c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR)) 
        return c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
    if (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH)) 
        return c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
    return c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);
  }
}

1
2番目の方法では、一部の参照をd1、d2からc1、c2に更新するのを忘れていました。
stivlo

1
その詳細を修正した後、コードは適切に機能します。私は広範囲にわたってユニットテストを行いました。日付からカレンダーを作成するステップを追加し、新しく作成したgithubプロジェクトorg.obliquid.helpersでコードを使用しました。ありがとうございます。
stivlo

外部ライブラリを使用しない、甘くて素晴らしいソリューション。
4gus71n 2013年

1
これらのメソッドはすべて非推奨です。これは何らかの影響を与える可能性がありますか?
Pranav Mahajan 2015

36

私の好みは使用することですジョダのライブラリinsetad java.util.Dateジョダが(参照日付と時刻を区別して、直接にYearMonthDayのDateTimeクラス)。

ただし、使用する場合はjava.util.Date、ユーティリティメソッドを作成することをお勧めします。例えば

public static Date setTimeToMidnight(Date date) {
    Calendar calendar = Calendar.getInstance();

    calendar.setTime( date );
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

1
Joda-Time YearMonthDayは廃止され、LocalDateが採用されました。また、夏時間のためにタイムゾーンに午前00:00がない場合、カレンダーのコードに問題があります。
JodaStephen

1
これは100%機能しません。私がそれをしたユースケースを持っていて、calendar.getTime()はまだパラメータの日付として設定された時間で時間を返します。フィールドをクリアして、年、月、日のみを設定するのが最適です。
ジョナサン

31

この代替案について意見はありますか?

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

1
文字列に変換するのが良い考えであったとしても、私はそれがうまくいくとは思いません。==オペレータは、必ずしも戻らないtrue同等の文字列(使用するためequals())。もちろん、あなたが言及した他の比較演算子も使用できません。
harto 2009

1
ああそう-私のルビーは私のJavaを台無しにしています!<、>などにかかわらず、int型に文字列を変換することができ
ロバート・ブラウン

Jodaを使用するのが正しい方法ですが、これはエレガントです!
Arne Evertsson、2009

これは誰にとっても機能するわけではありませんが、非常にシンプルで軽量です。他のライブラリが利用できない場合の良い代替案。
Jacob Marble

日付の順序を取得するには、も使用できますsdf.format(date1).compareTo(sdf.format(date2));
Ole VV

18

2つの日付の月、日、年のみを比較する場合は、次のコードでうまくいきます。

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

ロブに感謝します。


13

私もJoda Timeを好みますが、代わりの方法を次に示します。

long oneDay = 24 * 60 * 60 * 1000
long d1 = first.getTime() / oneDay
long d2 = second.getTime() / oneDay
d1 == d2

編集

UTC以外の特定のタイムゾーンの日付を比較する必要がある場合に備えて、UTCを以下に示します。ただし、そのようなニーズがある場合は、Jodaに行くことをお勧めします。

long oneDay = 24 * 60 * 60 * 1000
long hoursFromUTC = -4 * 60 * 60 * 1000 // EST with Daylight Time Savings
long d1 = (first.getTime() + hoursFromUTC) / oneDay
long d2 = (second.getTime() + hoursFromUTC) / oneDay
d1 == d2

私はJoda Timeを使うほうがいいと言ったが、それは良い点だ。TZに本当に興味がないときだけ、私はそのような低い戦術に頼ります。
ダニエルC.ソブラル

分割は回避できます:Math.abs(second.getTime() - first.getTime()) < 1000L*60*60*24
Vadzim

@Vadzimそれを作る< oneDay
ダニエルC.ソブラル

2
@Vadzim、日付の間隔が1日未満かどうかのみをチェックします。必ずしも同じ日にいるとは限りません。
arahant、

@arahant、はい。2番目の日付が常に午前0時になる場合は、これで十分です。
Vadzim

12

tl; dr

myJavaUtilDate1.toInstant()
               .atZone( ZoneId.of( "America/Montreal" ) )
               .toLocalDate()
               .isEqual (
                   myJavaUtilDate2.toInstant()
                                  .atZone( ZoneId.of( "America/Montreal" ) )
                                  .toLocalDate()
               )

従来の日時クラスを避ける

Date&などの厄介な古いレガシー日時クラスはCalendar、現在java.timeクラスに取って代わられていません。

java.timeの使用

A java.util.DateはUTCのタイムライン上の瞬間を表します。java.timeで同等のものはInstantです。レガシークラスに追加された新しいメソッドを使用して変換できます。

Instant instant1 = myJavaUtilDate1.toInstant();
Instant instant2 = myJavaUtilDate2.toInstant();

日付で比較したい。日付を決定するには、タイムゾーンが重要です。どの日付でも、日付はゾーンごとに世界中で異なります。たとえば、パリの真夜中から数分後のフランスは新しい日ですが、モントリオールケベックでは「昨日」です。

指定適切なタイムゾーン名をの形式でcontinent/region、のようなAmerica/MontrealAfrica/CasablancaまたはPacific/Auckland。決してなど3-4文字の略称を使用していないESTか、ISTそのままではない真の時間帯ではなく、標準化、さらには一意ではありません(!)。

ZoneId z = ZoneId.of( "America/Montreal" );

をに適用ZoneIdしてInstantを取得しZonedDateTimeます。

ZonedDateTime zdt1 = instant1.atZone( z );
ZonedDateTime zdt2 = instant2.atZone( z );

LocalDateクラスは、時間日の時間帯なしなし日付専用の値を表しています。私たちは、抽出することができますLocalDateから、ZonedDateTime効果的に時刻部分を排除し、。

LocalDate localDate1 = zdt1.toLocalDate();
LocalDate localDate2 = zdt2.toLocalDate();

今のような方法を使用して、比較するisEqualisBeforeisAfter

Boolean sameDate = localDate1.isEqual( localDate2 );

参照してくださいIdeOne.comでライブ実行このコードを

instant1:2017-03-25T04:13:10.971Z | instant2:2017-03-24T22:13:10.972Z

zdt1:2017-03-25T00:13:10.971-04:00 [アメリカ/モントリオール] | zdt2:2017-03-24T18:13:10.972-04:00 [アメリカ/モントリオール]

localDate1:​​2017-03-25 | localDate2:2017-03-24

sameDate:false


java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeクラスはどこで入手できますか?

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


7

すでに言及したapache commons-utils

org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)

日付のみを含み、時間は含まないDateオブジェクトを提供します。 Date.compareTo


6

「簡単」または「簡単」と呼ぶことができる2つの日付を比較する方法はないと思います。

精度を下げて2つの時間インスタンスを比較する場合(たとえば、日付の比較のみ)、タイムゾーンが比較に与える影響を常に考慮する必要があります。

場合はdate12タイムゾーンで発生したイベントを指定されており、date2たイベントを指定し、ESTで発生したイベントを指定している場合、比較の影響を適切に理解するように注意する必要があります。

2つのイベントがそれぞれのタイムゾーンで同じカレンダーの日付に発生したかどうかを確認する目的ですか?または、2つの日付が特定のタイムゾーン(UTCまたはローカルTZなど)で同じカレンダーの日付に該当するかどうかを知る必要があります。

比較しようとしているのが実際に何であるかを理解したら、適切なタイムゾーンで年月日トリプルを取得して比較を行うだけです。

Jodaの時間により、実際の比較操作はかなり見栄えがよくなるかもしれませんが、比較のセマンティクスはまだ何かを理解する必要があります。



5

時間なしで2つの日付のみを比較する場合は、次のコードが役立つ場合があります。

final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date dLastUpdateDate = dateFormat.parse(20111116);
Date dCurrentDate = dateFormat.parse(dateFormat.format(new Date()));
if (dCurrentDate.after(dLastUpdateDate))
{
   add your logic
}

それはロブの答えと同じです。私が考えるジョーンのソリューションは、それは文字列へのラウンドトリップを必要としないと同じことを達成する必要があるため、より良いです。
2012

4

これがこのブログの解決策です:http : //brigitzblog.blogspot.com/2011/10/java-compare-dates.html

long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.println("Time in days: " + diffDays  + " days.");

つまり、ミリ秒単位の時間差が1日の長さより短いかどうかを確認できます。


4
このサンプルは、2つの日付が互いに24時間以内であるかどうかをチェックしますが、両方が同じ日付であるかどうかを確認するわけではありません。つまり、真夜中に及ぶ可能性があります。代わりに、両方のミリ秒のセットをMILLIS_IN_DAYで除算して結果を比較することをお勧めしますが、これはUTCの場合のみ正確で、現地時間ではありません。
2012

4

`

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

   Date date1=sdf.parse("03/25/2015");



  Date currentDate= sdf.parse(sdf.format(new Date()));

   return date1.compareTo(currentDate);

`


3

新しい考えかどうかはわかりませんが、私がやったように見せます

SimpleDateFormat dtf = new SimpleDateFormat("dd/MM/yyyy");
Date td_date = new Date();
String first_date = dtf.format(td_date);    //First seted in String 
String second_date = "30/11/2020";          //Second date you can set hear in String

String result = (first_date.equals(second_date)) ? "Yes, Its Equals":"No, It is not Equals";
System.out.println(result);

3

YEARプロパティと組み合わせてDAY_OF_YEARを確認するだけです

boolean isSameDay = 
firstCal.get(Calendar.YEAR) == secondCal.get(Calendar.YEAR) &&
firstCal.get(Calendar.DAY_OF_YEAR) == secondCal.get(Calendar.DAY_OF_YEAR)

編集:

これで、Kotlin拡張機能の機能を使用できます

fun Calendar.isSameDay(second: Calendar): Boolean {

    return this[Calendar.YEAR] == second[Calendar.YEAR] && this[Calendar.DAY_OF_YEAR] == second[Calendar.DAY_OF_YEAR]
}

fun Calendar.compareDatesOnly(other: Calendar): Int {

    return when {
        isSameDay(other) -> 0
        before(other) -> -1
        else -> 1
    }
}

たとえば、2015-01-01と2016-01-01のように、年が異なる日付は同じ年になる可能性があるため、これは誤りです。
nelson eldoro 2016

@nelsoneldoroあなたのコメントに感謝し、年のチェックを追加するのを忘れていましたが、今は大丈夫です。
Simon K. Gerges

2

Java 8では、Joda Timeのものと非常によく似たLocalDateを使用できます。


2
public Date saveDateWithoutTime(Date date) {
    Calendar calendar = Calendar.getInstance();

    calendar.setTime( date );
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.HOUR, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

これにより、時間を考慮せずに日付を比較できます。


1

SimpleDateFormatのgetDateInstanceを使用すると、時間のない2つの日付オブジェクトのみを比較できます。以下のコードを実行します。

public static void main(String[] args) {        
        Date date1  = new Date();
        Date date2  = new Date();
        DateFormat dfg = SimpleDateFormat.getDateInstance(DateFormat.DATE_FIELD);
        String dateDtr1 = dfg.format(date1);
        String dateDtr2 = dfg.format(date2);
        System.out.println(dateDtr1+" : "+dateDtr2);
        System.out.println(dateDtr1.equals(dateDtr2));  

    }


1

ここでの回答と私のメンターガイダンスに基づく別の単純な比較方法

public static int compare(Date d1, Date d2) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(d1);
    c1.set(Calendar.MILLISECOND, 0);
    c1.set(Calendar.SECOND, 0);
    c1.set(Calendar.MINUTE, 0);
    c1.set(Calendar.HOUR_OF_DAY, 0);
    c2.setTime(d2);
    c2.set(Calendar.MILLISECOND, 0);
    c2.set(Calendar.SECOND, 0);
    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.HOUR_OF_DAY, 0);
    return c1.getTime().compareTo(c2.getTime());
  }

編集:@Jonathan Drapeauによれば、上記のコードはいくつかのケースで失敗し(私はそれらのケースを見たいです)、私が理解しているように彼は次のことを提案しました:

public static int compare2(Date d1, Date d2) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.clear();
    c2.clear();
    c1.set(Calendar.YEAR, d1.getYear());
    c1.set(Calendar.MONTH, d1.getMonth());
    c1.set(Calendar.DAY_OF_MONTH, d1.getDay());
    c2.set(Calendar.YEAR, d2.getYear());
    c2.set(Calendar.MONTH, d2.getMonth());
    c2.set(Calendar.DAY_OF_MONTH, d2.getDay());
    return c1.getTime().compareTo(c2.getTime());
}

Dateクラスは国際化に対応できなかったため、非推奨になっていることに注意してください。代わりにCalendarクラスが使用されます!


これは100%機能しません。私がそれをしたユースケースを持っていて、calendar.getTime()はまだパラメータの日付として設定された時間で時間を返します。フィールドをクリアして、年、月、日のみを設定するのが最適です。
ジョナサン

@JonathanDrapeau、それはあなたが明示的なタイムゾーンを選択しないことの結果に遭遇したかもしれないように私に聞こえます。の非推奨のgetXxxメソッドを使用するよりも、タイムゾーンを明示的にする方が確実ですDate
Ole VV

1

まず、この操作はタイムゾーンに依存することに注意してください。そのため、UTC、コンピュータのタイムゾーン、自分の好きなタイムゾーン、どこで行うかを選択します。それが重要であるとまだ確信していない場合は、この回答の下部にある私の例を参照してください。

あなたの質問はこれについて完全に明確ではないので、ある時点を表し、を実装するインスタンスフィールドを持つクラスがComparableあり、オブジェクトの自然な順序を日付ではなく、日付順にしたいとします、そのフィールドの。例えば:

public class ArnesClass implements Comparable<ArnesClass> {

    private static final ZoneId arnesTimeZone = ZoneId.systemDefault();

    private Instant when;

    @Override
    public int compareTo(ArnesClass o) {
        // question is what to put here
    }

}

Java 8 java.timeクラス

インスタンスフィールドのタイプをJava 8の対応するクラスからDateに自由に変更しました。以下Instantの処理に戻ることを約束しDateます。タイムゾーン定数も追加しました。あなたはそれをZoneOffset.UTCまたはZoneId.of("Europe/Stockholm")あなたが適切であると思うものに設定することができます(はサブクラスであるZoneOffsetため、作品に設定しますZoneOffsetZoneId)。

私はJava 8クラスを使用してソリューションを表示することを選択しました。最も簡単な方法を求めましたよね?:-)これがcompareToあなたが求めた方法です:

public int compareTo(ArnesClass o) {
    LocalDate dateWithoutTime = when.atZone(arnesTimeZone).toLocalDate();
    LocalDate otherDateWithoutTime = o.when.atZone(arnesTimeZone).toLocalDate();
    return dateWithoutTime.compareTo(otherDateWithoutTime);
}

の時間部分が必要ない場合whenは、もちろんwhenLocalDateすべての変換をスキップです。そうすれば、タイムゾーンについても心配する必要がなくなります。

ここで、なんらかの理由でwhenフィールドを宣言できないInstantか、古い形式にしたいとしますDate。それでもJava 8を使用できる場合は、それをInstantに変換してから、以前のように実行します。

    LocalDate dateWithoutTime = when.toInstant().atZone(arnesTimeZone).toLocalDate();

同様にo.when

Java 8はありませんか?

Java 8を使用できない場合、2つのオプションがあります。

  1. Calendarまたはのいずれかの古いクラスを使用して解決しますSimpleDateFormat
  2. Java 8の日付と時刻クラスのバックポートをJava 6と7に使用し、上記と同じようにします。下部にリンクを含めます。JodaTimeは使用しないでください。JodaTimeは、それを推奨する回答が書かれたときにおそらく良い提案でした。しかし、JodaTimeは現在メンテナンスモードになっているので、ThreeTenバックポートはより優れた、より将来性のあるオプションです。

昔ながらの方法

Adamskiの答えDateCalendarクラスを使用して時間部分を取り除く方法を示しています。を使用getInstance(TimeZone)して、Calendar必要なタイムゾーンのインスタンスを取得することをお勧めします。別の方法として、Jornの回答の後半からのアイデアを使用できます。

にはオブジェクトが含まれているため、使用SimpleDateFormatは実際には間接的な使用方法です。ただし、直接使用するよりも問題が少ない場合があります。CalendarSimpleDateFormatCalendarCalendar

private static final TimeZone arnesTimeZone = TimeZone.getTimeZone("Europe/Stockholm");
private static final DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
static {
    formatter.setTimeZone(arnesTimeZone);
}

private Date when;

@Override
public int compareTo(ArnesClass o) {
    return formatter.format(when).compareTo(formatter.format(o.when));
}

これはロブの答えに触発されました。

タイムゾーンの依存関係

特定のタイムゾーンを選択する必要があるのはなぜですか?UTCで3月24日の0:00(真夜中)と12:00(正午)の2回を比較するとします。CET(たとえば、Europe / Paris)でこれを行うと、3月24日の午前1時と午後1時、つまり同じ日付になります。ニューヨーク(東部夏時間)では、3月23日は20:00、3月24日は8:00です。つまり、同じ日付ではありません。したがって、選択するタイムゾーンによって違いが生じます。コンピュータのデフォルトに依存している場合、誰かがこのグローバル化された世界の別の場所にあるコンピュータでコードを実行しようとすると、驚かれるかもしれません。

リンク

Java 8の日付と時刻クラスのJava 6および7へのバックポートであるThreeTenバックポートへのリンク:http ://www.threeten.org/threetenbp/ 。


0

私の命題:

    Calendar cal = Calendar.getInstance();
    cal.set(1999,10,01);   // nov 1st, 1999
    cal.set(Calendar.AM_PM,Calendar.AM);
    cal.set(Calendar.HOUR,0);
    cal.set(Calendar.MINUTE,0);
    cal.set(Calendar.SECOND,0);
    cal.set(Calendar.MILLISECOND,0);

    // date column in the Thought table is of type sql date
    Thought thought = thoughtDao.getThought(date, language);

    Assert.assertEquals(cal.getTime(), thought.getDate());

0

あなたができるApacheコモンズを使用して:

import org.apache.commons.lang3.time.DateUtils

DateUtils.truncatedEquals(first, second, Calendar.DAY_OF_MONTH)

0
public static Date getZeroTimeDate(Date fecha) {
    Date res = fecha;
    Calendar calendar = Calendar.getInstance();

    calendar.setTime( fecha );
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    res = calendar.getTime();

    return res;
}

Date currentDate = getZeroTimeDate(new Date());// get current date   

これがこの問題を解決する最も簡単な方法です。


0

私はタイムスタンプで比較することでこれを解決しました:

    Calendar last = Calendar.getInstance();

    last.setTimeInMillis(firstTimeInMillis);

    Calendar current = Calendar.getInstance();

    if (last.get(Calendar.DAY_OF_MONTH) != current.get(Calendar.DAY_OF_MONTH)) {
        //not the same day
    }

Androidでは巨大なスペースを使用するので、Joda Timeの使用は避けます。サイズが重要です。;)


0

Java 8とInstantを使用する別のソリューションは、truncateToメソッドを使用することです

このインスタントのコピーを、指定された単位に切り捨てて返します。

例:

@Test
public void dateTruncate() throws InterruptedException {
    Instant now = Instant.now();
    Thread.sleep(1000*5);
    Instant later = Instant.now();
    assertThat(now, not(equalTo(later)));
    assertThat(now.truncatedTo(ChronoUnit.DAYS), equalTo(later.truncatedTo(ChronoUnit.DAYS)));
}

0
// Create one day 00:00:00 calendar
int oneDayTimeStamp = 1523017440;
Calendar oneDayCal = Calendar.getInstance();
oneDayCal.setTimeInMillis(oneDayTimeStamp * 1000L);
oneDayCal.set(Calendar.HOUR_OF_DAY, 0);
oneDayCal.set(Calendar.MINUTE, 0);
oneDayCal.set(Calendar.SECOND, 0);
oneDayCal.set(Calendar.MILLISECOND, 0);

// Create current day 00:00:00 calendar
Calendar currentCal = Calendar.getInstance();
currentCal.set(Calendar.HOUR_OF_DAY, 0);
currentCal.set(Calendar.MINUTE, 0);
currentCal.set(Calendar.SECOND, 0);
currentCal.set(Calendar.MILLISECOND, 0);

if (oneDayCal.compareTo(currentCal) == 0) {
    // Same day (excluding time)
}

ありがとう!ただし、すでに同じアプローチで他の回答がいくつかあります。ただし、現在はCalendarオブジェクトを直接比較しているのに対し、それらは主にgetTime()を比較しています。
Rup

-2

これは私のために働いたものです:

var Date1 = new Date(dateObject1.toDateString()); //this sets time to 00:00:00
var Date2 = new Date(dateObject2.toDateString()); 
//do a normal compare
if(Date1 > Date2){ //do something }

2
「通常の」比較では、Javaでコンパイルすることすらできません。その場合、オブジェクト参照を比較しますが、これは許可されていません。
stivlo

Markdownを追加するために編集しましたが、stivloは正しいです。そのコードがどのように「あなたのために働いた」のか私にはわかりません。
ポップス

これはおそらくjsです。
Andrey Luiz

-2

いかがですかDateUtil.daysBetween()。これはJavaであり、数値(日数の差)を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.