Лучший способ сравнить даты в Android

Я пытаюсь сравнить дату в строковом формате с текущей датой. Вот как я это сделал (не проверял, но должен работать), но использую устаревшие методы. Любое хорошее предложение для альтернативы? Благодарю.

Постскриптум Я действительно ненавижу делать вещи с датой на 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;
}
 Ole V.V.15 июн. 2018 г., 11:33
В 2018 году лучший способ не включает в себяCalendar, SimpleDateFormat, Date или любой другой давно устаревший класс даты и времени Java. Вместо этого используйтеjava.time, the modern Java date and time API, Да, вы можете использовать его на Android. Для старых Android см.How to use ThreeTenABP in Android Project.

Ответы на вопрос(13)

Решение Вопроса

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;
}
 nunos27 мая 2012 г., 17:14
просто хотел убедиться, прежде чем принять. Благодарю. это работало отлично и является кратким и простым как хотел.
 09 февр. 2016 г., 06:18
это работает для меня .. 2-й. Спасибо чувак
 27 мая 2012 г., 17:03
это работает точно, я отправил то же решение в другой теме, но не здесь, потому что коллега был быстрее, O_o.
 nunos27 мая 2012 г., 16:59
классно. Я просто попробую это и приму это, если это работает.
 20 окт. 2013 г., 09:38
Я думаю, что вместо dd / mm / yyyy следует использовать формат dd / MM / yyyy, потому что & quot; m & quot; означает минуты и «М»; значит месяц.

Ты можешь использоватьvalidDate.setTime(strDate) Have a look at the javadoc at http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

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

 }
 15 февр. 2019 г., 21:02
К вашему сведению, хлопотные старые классы даты и времени, такие какjava.util.Date, java.util.Calendar, а такжеjava.text.SimpleDateFormat в настоящее время наследие, вытесненноеjava.time классы. Большинство изjava.time функциональность перенесена в Java 6 & amp; Java 7 вThreeTen-Backport проект. Дополнительно адаптировано для более ранней версии Android (& lt; 26) вThreeTenABP, УвидетьHow to use ThreeTenABP….

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;
}

java.time and 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");
    }

Когда я только что запустил этот код, вывод был:

Catalog is outdated

Поскольку во всех часовых поясах эта дата никогда не бывает одинаковой, укажитеLocalDate.now, Если вы хотите, чтобы срок действия каталога истек одновременно во всех часовых поясах, вы можете указатьZoneOffset.UTC до тех пор, пока вы сообщаете пользователям, что используете UTC.

Я использую java.time, современный API даты и времени Java. Классы даты и времени, которые вы использовали,Calendar, SimpleDateFormat а такжеDateВсе они плохо спроектированы и, к счастью, давно устарели. Также, несмотря на названиеDate не представляет собой дату, но является моментом времени. Одним из следствий этого является: хотя сегодня 15 февраля 2019 года, недавно созданныйDate объект ужеafter (так что не равно)Date объект от разбора15/02/2019, Это смущает некоторых. Вопреки этому современныйLocalDate дата без времени суток (и без часового пояса), поэтому дваLocalDates, представляющие сегодняшнюю дату, всегда будут равны.

Question: Can I use java.time on Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Это просто требует как минимумJava 6.

In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in. In Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom). On (older) Android use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from org.threeten.bp with subpackages. Links Oracle tutorial: Date Time explaining how to use java.time. Java Specification Request (JSR) 310, where java.time was first described. ThreeTen Backport project, the backport of java.time to Java 6 and 7 (ThreeTen for JSR-310). ThreeTenABP, Android edition of ThreeTen Backport Question: How to use ThreeTenABP in Android Project, with a very thorough explanation.

Calendar изDate:

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

сравнить с()

CompareTo method must return negative number if current object is less than other object, positive number if current object is greater than other object and zero if both objects are equal to each other.

// 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 "); 
}
 15 февр. 2019 г., 21:03
К вашему сведению, хлопотные старые классы даты и времени, такие какjava.util.Date, java.util.Calendar, а такжеjava.text.SimpleDateFormat в настоящее время наследие, вытесненноеjava.time классы. Большинство изjava.time функциональность перенесена в Java 6 & amp; Java 7 вThreeTen-Backport проект. Дополнительно адаптировано для более ранней версии Android (& lt; 26) вThreeTenABP, УвидетьHow to use ThreeTenABP….

что правильный формат («дд / мм / гггг»), прежде чем код работает. & Quot; мм & Quot; означает минуты!

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;
}
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));

представленное этим календарем, с временем, представленным данным календарем.

Возвращает 0, если времена двух Календарей равны, -1, если время этого Календаря предшествует другому, 1, если время этого Календаря позади другого.

 02 мар. 2016 г., 06:50
Спасибо. Это помогает мне.
Joda-Time

Избежать их. Используйте либоJoda времени или новый пакет java.time в Java 8.

LocalDate

Если вы хотите использовать только дату без времени, используйте класс LocalDate.

Time Zone

Получение текущей даты зависит от часового пояса. Новая дата переносится в Париже до того, как Montrél. Al. Укажите желаемый часовой пояс, а не зависите от значения по умолчанию 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 );

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() чтобы получить значение и сравнить.

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();
    }

и вы также можете проверить до и равно с помощью date.before и date.equal ..

сегодня с часом

вчера со вчерашнего дня

другие дни с 23/06/2017

Для этого нам нужно сравнить текущее время с нашими данными.

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 и этосообщение.

Ваш ответ на вопрос