Androidで日付を比較する最良の方法


102

文字列形式の日付を現在の日付と比較しようとしています。これは私がやった方法です(テストしていませんが、動作するはずです)が、非推奨のメソッドを使用しています。代替案について何か良い提案はありますか?ありがとう。

PS私はJavaで日付のことをするのが本当に嫌いです。同じことをする方法はたくさんあるので、どれが正しいかわからないので、ここで私の質問です。

String valid_until = "1/1/1990";

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated       

Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);

Calendar currentDate = Calendar.getInstance();

if (currentDate.after(validDate)) {
    catalog_outdated = 1;
}

4
2018年には最良の方法は、必要としないCalendarSimpleDateFormatDateまたは他の長い時代遅れのJavaの日付と時刻クラスのいずれか。代わりjava.timeに、最新のJava日時APIを使用してください。はい、Androidで使用できます。古いAndroidについては、「AndroidプロジェクトでThreeTenABPを使用する方法」を参照してください。
Ole VV

回答:


219

あなたのコードは

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

または

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}

それは確かに機能します。同僚がより速くO_oだったので、他のスレッドに同じソリューションを投稿しましたが、ここにはありません。
Simon Dorociak、2012年

受け入れる前に確認したかっただけです。ありがとう。それは完璧に機能し、必要に応じて簡潔でシンプルです。
nunos

16
「m」は分を意味し、「M」は月を意味するため、dd / mm / yyyyの代わりにdd / MM / yyyy形式を使用する必要があると思います。
Demwis 2013年

compareTo()メソッドを使用する方が良いのではないですか?
クラスAndroid

25

あなたはcompareTo()を使うことができます

CompareToメソッドは、現在のオブジェクトが他のオブジェクトよりも小さい場合は負の数を返し、現在のオブジェクトが他のオブジェクトよりも大きい場合は正の数を返し、両方のオブジェクトが互いに等しい場合はゼロを返す必要があります。

// Get Current Date Time
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm aa");
String getCurrentDateTime = sdf.format(c.getTime());
String getMyTime="05/19/2016 09:45 PM ";
Log.d("getCurrentDateTime",getCurrentDateTime); 
// getCurrentDateTime: 05/23/2016 18:49 PM

if (getCurrentDateTime.compareTo(getMyTime) < 0)
{

}
else
{
 Log.d("Return","getMyTime older than getCurrentDateTime "); 
}

1
FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat取って代わら今あるレガシー、java.timeのクラス。java.time機能のほとんどは、ThreeTen -BackportプロジェクトのJava 6およびJava 7にバックポートされています。ThreeTenABPの以前のAndroid(<26)にさらに適合。ThreeTenABPの使用方法…を参照してください。
バジルブルク

10

Calendarから直接を作成できますDate

Calendar validDate = new GregorianCalendar();
validDate.setTime(strDate);
if (Calendar.getInstance().after(validDate)) {
    catalog_outdated = 1;
}

10

コードが機能する前の正しい形式は( "dd / MM / yyyy")であることに注意してください。「mm」はミントを意味します!

String valid_until = "01/07/2013";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = null;
try {
    strDate = sdf.parse(valid_until);
} catch (ParseException e) {
    e.printStackTrace();
}
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

7
Calendar toDayCalendar = Calendar.getInstance();
Date date1 = toDayCalendar.getTime();


Calendar tomorrowCalendar = Calendar.getInstance();
tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1);
Date date2 = tomorrowCalendar.getTime();

// date1 is a present date and date2 is tomorrow date

if ( date1.compareTo(date2) < 0 ) {

  //  0 comes when two date are same,
  //  1 comes when date1 is higher then date2
  // -1 comes when date1 is lower then date2

 }

FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat取って代わら今あるレガシー、java.timeのクラス。java.time機能のほとんどは、ThreeTen -BackportプロジェクトのJava 6およびJava 7にバックポートされています。ThreeTenABPの以前のAndroid(<26)にさらに適合。ThreeTenABPの使用方法…を参照してください。
バジルブルク

6
String date = "03/26/2012 11:00:00";
    String dateafter = "03/26/2012 11:59:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "MM/dd/yyyy hh:mm:ss");
    Date convertedDate = new Date();
    Date convertedDate2 = new Date();
    try {
        convertedDate = dateFormat.parse(date);
        convertedDate2 = dateFormat.parse(dateafter);
        if (convertedDate2.after(convertedDate)) {
            txtView.setText("true");
        } else {
            txtView.setText("false");
        }
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

true ..を返します。また、date.beforeおよびdate.equal。を使用してbeforeおよびequalをチェックすることもできます。


3
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault());
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

Date date1 = dateFormat.parse("2013-01-01");
Date date2 = dateFormat.parse("2013-01-02");

calendar1.setTime(date1);
calendar2.setTime(date2);

System.out.println("Compare Result : " + calendar2.compareTo(calendar1));
System.out.println("Compare Result : " + calendar1.compareTo(calendar2));

このCalendarによって表される時刻を、指定されたCalendarによって表される時刻と比較します。

2つのカレンダーの時間が等しい場合は0を返し、このカレンダーの時間が他のカレンダーより前の場合は-1を返し、このカレンダーの時間が他のカレンダーより後の場合は1を返します。


1
ありがとう..その助けてください。
pRaNaY 2016年

2

日付をカレンダーに変換し、そこで計算します。:)

Calendar cal = Calendar.getInstance();
cal.setTime(date);

int year = cal.get(Calendar.YEAR);
int month = cal.geT(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH); //same as cal.get(Calendar.DATE)

または:

SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}

2

現代の答えの時間です。

java.timeとThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    String validUntil = "1/1/1990";
    LocalDate validDate = LocalDate.parse(validUntil, dateFormatter);
    LocalDate currentDate = LocalDate.now(ZoneId.of("Pacific/Efate"));
    if (currentDate.isAfter(validDate)) {
        System.out.println("Catalog is outdated");
    }

このコードを今実行したときの出力は次のとおりです。

カタログが古くなっています

すべてのタイムゾーンで同じ日付になることはないため、明示的にタイムゾーンを指定してくださいLocalDate.now。すべてのタイムゾーンでカタログが同時に期限切れになるZoneOffset.UTCようにする場合は、UTCを使用していることをユーザーに通知する限り、与えることができます。

私は、最新のJava日時APIであるjava.timeを使用しています。使用した日時クラスCalendarSimpleDateFormatおよびDateはすべて設計が不十分であり、幸いにも古くなっています。また、名前a Dateは日付を表すのではなく、ある時点を表しています。これによる1つの結果は次のとおりです。今日が2019年2月15日であるにもかかわらず、新しく作成されたDateオブジェクトは、既に解析されたオブジェクトの後にあります(等しくない)。これはいくつかを混乱させます。これとは対照的に、現代は時刻なし(およびタイムゾーンなし)の日付なので、今日の日付を表す2つのは常に等しくなります。Date15/02/2019LocalDateLocalDate

質問:Androidでjava.timeを使用できますか?

はい、java.timeは新旧のAndroidデバイスでうまく動作します。少なくともJava 6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Java 6および7では、モダンクラスのバックポートであるThreeTenバックポートを取得します(JSR 310の場合はThreeTen。下部のリンクを参照)。
  • (古い)Androidでは、Android版のThreeTenバックポートを使用します。それはThreeTenABPと呼ばれています。そしてorg.threeten.bp、サブパッケージを使用して日付と時刻のクラスをインポートするようにしてください。

リンク集


1

あなたはこれを試すことができます

Calendar today = Calendar.getInstance (); 
today.add(Calendar.DAY_OF_YEAR, 0); 
today.set(Calendar.HOUR_OF_DAY, hrs); 
today.set(Calendar.MINUTE, mins ); 
today.set(Calendar.SECOND, 0); 

today.getTime()値を取得して比較するために使用できます。


1

時々、次のような日付のリストを作成する必要があります

今日は時間あり

昨日と昨日

2017年6月23日のその他の日

これを行うには、現在の時刻をデータと比較する必要があります。

Public class DateUtil {

    Public static int getDateDayOfMonth (Date date) {
        Calendar calendar = Calendar.getInstance ();
        Calendar.setTime (date);
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static int getCurrentDayOfMonth () {
        Calendar calendar = Calendar.getInstance ();
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static String convertMillisSecondsToHourString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("HH: mm");
        Return formatter.format (date);
    }

    Public static String convertMillisSecondsToDateString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("dd / MM / yyyy");
        Return formatter.format (date);
    }

    Public static long convertToMillisSecond (Date date) {
        Return date.getTime ();
    }

    Public static String compare (String stringData, String yesterday) {

        String result = "";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss");
        Date date = null;

        Try {
            Date = simpleDateFormat.parse (stringData);
        } Catch (ParseException e) {
            E.printStackTrace ();
        }

        Long millisSecond = convertToMillisSecond (date);
        Long currencyMillisSecond = System.currentTimeMillis ();

        If (currencyMillisSecond> millisSecond) {
            Long diff = currencyMillisSecond - millisSecond;
            Long day = 86400000L;

            If (diff <day && getCurrentDayOfMonth () == getDateDayOfMonth (date)) {
                Result = convertMillisSecondsToHourString (millisSecond);

            } Else if (diff <(day * 2) && getCurrentDayOfMonth () -1 == getDateDayOfMonth (date)) {
                Result = yesterday;
            } Else {
                Result = convertMillisSecondsToDateString (millisSecond);
            }
        }

        Return result;
    }
}

また、この例はGitHubとこの投稿で確認できます。


1

更新:ジョダタイムライブラリは、メンテナンスモードになり、そしてへの移行を推奨しjava.timeのそれを成功するフレームワーク。Ole VVによる回答を参照してください。


ジョーダタイム

java.util.Dateクラスと.Calendarクラスは、非常に面倒です。それらを避けてください。いずれかを使用しジョダタイムやJava 8の新しいjava.timeパッケージを。

LocalDate

時刻なしの日付のみが必要な場合は、LocalDateクラスを使用します。

タイムゾーン

現在の日付の取得は、タイムゾーンによって異なります。新しい日付がモントリオールの前にパリで繰り越されます。JVMのデフォルトに依存するのではなく、目的のタイムゾーンを指定します。

Joda-Time 2.3の例

DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "1/1/1990" );
boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );


0
SimpleDateFormat sdf=new SimpleDateFormat("d/MM/yyyy");
Date date=null;
Date date1=null;
try {
       date=sdf.parse(startDate);
       date1=sdf.parse(endDate);
    }  catch (ParseException e) {
              e.printStackTrace();
    }
if (date1.after(date) && date1.equals(date)) {
//..do your work..//
}

0

Kotlinはオペレーターのオーバーロードをサポートしています

Kotlinでは、比較演算子を使用して簡単に日付を比較できます。Kotlinは既にオペレーターのオーバーロードをサポートしているためです。したがって、日付オブジェクトを比較するには:

firstDate: Date = // your first date
secondDate: Date = // your second date

if(firstDate < secondDate){
// fist date is before second date
}

カレンダーオブジェクトを使用している場合は、次のように簡単に比較できます。

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