Можно ли получить разницу во времени непосредственно из полей Календаря? - PullRequest
0 голосов
/ 18 ноября 2018

извините, если название сбивает с толку. Позвольте мне объяснить четко. Мне нужно играть с днями, месяцами и годами. Для этого я использую Календарь. Вот мой код;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int dayStart=0,monthStart=0,yearStart=0,dayFinish=0,monthFinish=0,yearFinish=0;

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

            cal.set(Calendar.MONTH,Calendar.MAY); //SET MONTH AS MAY
            cal.set(Calendar.DATE,1);
            cal.set(Calendar.YEAR,2018);

            monthStart=(cal.getCalendar.MONTH)+1);
            dayStart=cal.get(Calendar.DATE);
            yearStart=cal.get(Calendar.YEAR);

            System.out.println("STARTING DAY: "+dayStart+" STARTING MONTH: "+monthStart+" STARTING YEAR: "+yearStart);

            cal.add(Calendar.MONTH,6); //ADD 6 MONTHS

            monthFinish = (cal.get(Calendar.MONTH)+1);
            dayFinish = (cal.get(Calendar.DATE));
            yearFinish = (cal.get(Calendar.YEAR));

            System.out.println("FINISHING DAY: "+dayFinish+" FINISHNG MONTH: "+monthFinish+" FINISHING YEAR: "+yearFinish);
//WHAT I WANT IS printing out the days between 2 dates: 184
    }

Сначала я устанавливаю время: 1 5 2018, затем добавляю 6 месяцев, и время становится 1 11 2018. Мне нужно получить разницу в днях как 184 (если я установлю месяц январь, он должен быть 181) Можно ли сделать это, просто преобразовав соответствующие поля календаря (дата, месяц, год) в секунды или миллисекунды, и вычтите значение в миллисекундах (1 5 2018) из (1 11 2018) и преобразовав обратные миллисекунды в дни? Есть похожие вопросы, но я не смог найти решение именно так, как я хочу.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

java.time

    LocalDate start = LocalDate.of(2018, Month.MAY, 1);
    LocalDate finish = start.plusMonths(6);
    long daysBetween = ChronoUnit.DAYS.between(start, finish);
    System.out.format("Days between %s and %s: %d%n", start, finish, daysBetween);

ИМХО понятно и кратко.И бонус, он работает правильно.Вывод:

Дни между 2018-05-01 и 2018-11-01: 184

Класс Calendar имеет проблемы с дизайном и в настоящее время давно устарел.Поэтому я рекомендую использовать вместо этого java.time, современный Java-интерфейс даты и времени. - это способ правильно рассчитать Calendar дней, но это сложнее, чем вы ожидаете, и нет причин, по которым вам стоит беспокоиться.Подсчет дней из миллисекунд (который показан в нескольких ответах на переполнение стека, а не только в другом ответе на этот вопрос) когда-нибудь даст правильный результат, иногда нет.Эти две проблемы: (1) Из-за летнего времени (DST) и других разрывов день может составлять 23, 24 или 25 часов или некоторое число между или даже вне этого интервала.Если день в интервале короче, чем 24 часа, преобразование из миллисекунд приведет к тому, что 1 день будет слишком мал.(2) Calendar (несмотря на его название) также содержит время суток.В вашем коде оно будет храниться в одно и то же время до и после добавления 6 месяцев.В других случаях разное время дня может привести к тому, что вы получите 1 день слишком мало или в редких случаях 1 день слишком много.

Вопрос: Можно ли использовать java.time на Android?

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

  • В Java 8 и более поздних версиях и на новых устройствах Android (от уровня API 26, как мне сказали), новый API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310, где впервые был описан современный API).
  • На (более старом) Android, используйте Android-версию ThreeTen Backport.Это называется ThreeTenABP.Убедитесь, что вы импортировали классы даты и времени из пакета org.threeten.bp и подпакетов.

Ссылки

0 голосов
/ 19 ноября 2018

Что-то, что вы можете сделать. Измените год, месяц и дату и установите в календаре. Используйте java.time.temporal.ChronoUnit, чтобы получить разницу. Пример кода приведен ниже.

public void daysBetween () {

    Calendar startOfMonth = Calendar.getInstance();
    startOfMonth.set(Calendar.YEAR, 2018);
    startOfMonth.set(Calendar.MONTH, 10);
    startOfMonth.set(Calendar.DAY_OF_MONTH, 1);

    Calendar endOfMonth = Calendar.getInstance();
    endOfMonth.set(Calendar.YEAR, 2018);
    endOfMonth.set(Calendar.MONTH, 10);
    endOfMonth.set(Calendar.DAY_OF_MONTH, 30);

    System.out.println(ChronoUnit.DAYS.between(startOfMonth.toInstant(),endOfMonth.toInstant()));
}
0 голосов
/ 18 ноября 2018

Вы можете попробовать что-то похожее на это, должно работать для вас

import java.util.*; 
import java.util.concurrent.TimeUnit;
public class Calendar1 { 
    public static void main(String args[]) 
    { 
        Calendar startDate = Calendar.getInstance(); 
        //Setting year, month and day
        startDate.set(2018, 5, 1);
        Calendar endDate = Calendar.getInstance(); 
        endDate.set(2018, 11, 1);
        long end = endDate.getTimeInMillis();
        long start = startDate.getTimeInMillis();
        System.out.println("Time difference in days " + TimeUnit.MILLISECONDS.toDays(Math.abs(end - start)));

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