Как я могу получить резюме между 2 дата в Android? - PullRequest
0 голосов
/ 04 февраля 2019

Я выбрал дату из средства выбора даты и другое из текущего системного времени.Когда я хочу вычесть 2 даты, что один из них до 2000 года, я получаю неправильный ответ в течение года.как я могу решить это?

public class Duration {
    private int year,month,day,hour,min,seconds;

    public Duration(long endTime, long startTime){
        Calendar calendar1=new GregorianCalendar();
        calendar1.setTimeInMillis(endTime);
        Calendar calendar=new GregorianCalendar();
        calendar.setTimeInMillis(startTime);
        this.year=calendar1.get(Calendar.YEAR)-calendar.get(Calendar.YEAR);
        this.month=calendar1.get(Calendar.MONTH)-calendar.get(Calendar.MONTH);
        this.day=calendar1.get(Calendar.DAY_OF_MONTH)-calendar.get(Calendar.DAY_OF_MONTH);
        this.hour=calendar1.get(Calendar.HOUR)-calendar.get(Calendar.HOUR);
        this.min=calendar1.get(Calendar.MINUTE)-calendar.get(Calendar.MINUTE);
        this.seconds=calendar1.get(Calendar.SECOND)-calendar.get(Calendar.SECOND);
        System.out.println(toString());
    }

    public int getDay() {
        return day;
    }

    public int getHour() {
        return hour;
    }

    public int getMin() {
        return min;
    }

    public int getMonth() {
        return month;
    }

    public int getSeconds() {
        return seconds;
    }

    public int getYear() {
        return year;
    }

    @Override
    public String toString() {
        return year+" "+month+" "+day+" "+hour+" "+min+" "+seconds;
    }
}

, когда я хочу вычесть дату в 1998/2 / jan из текущего времени, я получаю такой результат:

-1879 1 3 10 24 34

чем является год 't правильно.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Метод: 1

 try {
    DateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    Date date1 = new java.util.Date();
    Date date2 = df.parse("04-02-2019 12:00:00");
    long diff = date2.getTime() - date1.getTime();

    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(diff);
    int year = cal.get(Calendar.YEAR);
    Log.e("Diff Year" , year+ " --" + diff);
    Log.e("Diff Value" , date1.getTime() + " -- " + date2.getTime() + " --" + diff);

} catch (ParseException e){
    Log.e("Diff Value", "Exception", e.getMessage().toString());
}

Метод: 2

LocalDate d1 = LocalDate.parse("2017-04-02", 
DateTimeFormatter.ISO_LOCAL_DATE);
LocalDate d2 = LocalDate.parse("2018-04-04", 
DateTimeFormatter.ISO_LOCAL_DATE);
Duration dateDifference = Duration.between(d1.atStartOfDay(), 
d2.atStartOfDay());
long dayDifference = dateDifference.toDays();
  • Вычтите две даты и добавьте разницу вCalendar Объект и получить значение года из его объекта.
0 голосов
/ 05 февраля 2019

tl; др

LocalDate               // Represent a date-only value, without time-of-day and without time zone.
.of( 1999 , 1 , 23 )    // Use factory methods to instantiate rather than constructors, in the *java.time* classes.
.minusWeeks( 12 )       // Do date-math with `plus…` and `…minus` methods.
.toString()             // Generate text as a `String` object with text representing the date value in standard ISO 8601 format: YYYY-MM-DD

См. Этот код, запущенный в режиме реального времени на IdeOne.com .

1998-10-31

Избегайте устаревших классов даты и времени

Никогда не используйте Calendar или Date классы.Эти ужасные классы были вытеснены несколько лет назад классами java.time .

LocalDate

Класс LocalDate представляет дату-только значение без времени суток и без часовой пояс или смещение от UTC .

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca,или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

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

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента.Если опущен, код становится неоднозначным для чтения, поскольку мы не знаем наверняка, намеревались ли вы использовать значение по умолчанию или если вы, как и многие другие программисты, не знали о проблеме.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Или укажитесвидание.Вы можете установить месяц по номеру, с нормальным номером 1-12 для января-декабря.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Или, лучше, использовать предварительно определенные объекты перечисления Month, по одному на каждый месяц года.Совет: используйте эти Month объекты по всей вашей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументируемым, обеспечить допустимые значения и обеспечить type-safety .То же самое для Year & YearMonth.

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Period

Для представления промежутка времени в терминахгоды-месяцы-дни, используйте Period.

Period p = Period.ofDays( 5 ) ;

Математика даты и времени

Вы можете выполнять сложение и вычитание значений даты и времени в java.time путем вызова методов plus… и minus….

LocalDate later = ldt.plus( p ) ;

Duration

Если вы хотите представить промежуток времени в днях (24-часовые отрезки времени, не связанные с календарем), часы, минуты, секунды и доли секунды, используйте Duration.

Год

Ваш вопрос неясен, но, похоже, касается 2000 года. В этом году нет ничего особенного с классами java.time .

Вы можете опросить классы java.time для их значения года.

int year = ld.getYear() ;
if( year < 2000 ) { … }

О java.time

Среда java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Джаva 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большинство функций java.time перенесены на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Вы можете найти здесь несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 04 февраля 2019
LocalDate d1 = LocalDate.parse("2018-05-26", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDate d2 = LocalDate.parse("2018-05-28", DateTimeFormatter.ISO_LOCAL_DATE);
Duration diff = Duration.between(d1.atStartOfDay(), d2.atStartOfDay());
long diffDays = diff.toDays();

Вы получите количество дней в длинном формате.Также отошлите этот ответ от Mark Byers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...