Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Разница в датах

Ув. программисты, подскажите, пожалуйста, как правильно посчитать разницу между двумя датами в годах, месяцах и днях.
Я могу получить разницу между двумя датами просто в днях. С помощью простого Calendar в миллисекундах с последующим переводом в дни, с помощью старенького класса Date, и с помощью joda.time.
Но мне нужно не точное количество дней. К примеру, дата № 1 - 15.02.2019. Дата № 2 - 17.03.2019.
Вышеуказанные способы покажут ровное количество дней от 15.02.2019 до 17.03.2019, то есть 30 дней. А мне нужна разница вида: 1 месяц и 2 дня.
Тупо делить количество дней на 30, чтобы получить месяцы, я так понимаю, что мне не подходит. К примеру, в феврале 28 дней и даты посчитаются неверно.
В связи с этим, я хотел спросить - существуют ли стандартные функции, классы для решения моей проблемы, чтобы не придумывать заново велосипед, или все-таки придется самому все считать?

Заранее спасибо!
Ответ:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 Integer Mounth_Itog = 0;
        Integer Day_Itog = 0;
        Integer VisokFevral;
        String M_Razdelitel_D1[] = new String[2];
        String M_Razdelitel_D2[] = new String[2];
        String Date1 = "15-02-2019";
        String Date2 = "13-03-2019";
 
 
 
 
        M_Razdelitel_D1 = Date1.split("-");
        M_Razdelitel_D2 = Date2.split("-");
 
        int Day_1 = Integer.parseInt(M_Razdelitel_D1[0]);
        int Mounth_1 = Integer.parseInt(M_Razdelitel_D1[1]);
        int Year_1 = Integer.parseInt(M_Razdelitel_D1[2]);
 
        int Day_2 = Integer.parseInt(M_Razdelitel_D2[0]);
        int Mounth_2 = Integer.parseInt(M_Razdelitel_D2[1]);
        int Year_2 = Integer.parseInt(M_Razdelitel_D2[2]);
 
 
 
 
            GregorianCalendar c1 = new GregorianCalendar();
            if (c1.isLeapYear(Year_1) == true) {
                VisokFevral = 29;
            }else{
                VisokFevral = 28;
            }
 
 
            if(Year_1 == Year_2){
                if (Mounth_1 < Mounth_2){
                    Mounth_Itog = Mounth_2 - Mounth_1;
                    if (Day_1<Day_2){
                        Day_Itog = Day_2 - Day_1;
                    } else if (Day_1 > Day_2){
                        Mounth_Itog--;
                        if ((Mounth_2 - 1) == 2){
                            Day_Itog = VisokFevral - (Day_1-Day_2);
                        } else if ((Mounth_2 - 1) == 1 || (Mounth_2 - 1) == 3 || (Mounth_2 - 1) == 5 || (Mounth_2 - 1) == 7 || (Mounth_2 - 1) == 8 || (Mounth_2 - 1) == 10 || (Mounth_2 - 1) == 12 ){
                            Day_Itog = 31 - (Day_1-Day_2);
                        } else {
                            Day_Itog = 30 - (Day_1-Day_2);
                        }
 
                    }
                }
 
 
 
 
            }
 
 
        System.out.println(String.valueOf(Mounth_Itog.toString()));
        System.out.println(String.valueOf(Day_Itog.toString()));
Млин, набил... но только для условия, что год одинаковый, и дата вторая меньше первой. Понятно, что код корявый (от меня - новичка), ну, а что делать... В общем-то и остальные все условия можно набить, НО я честно удивлен, что таких подсчетов нет ни Calendar, Date, JodaTime.
Думал, это все уже набито кем-то по-любому. Искреннее Спасибо ExFau$t и Pablito за помощь!!!
Вопрос: Оповещение по заданному времени и дате

Здравствуйте, есть задача вывести оповещение по заданной пользователем дате и времени.
В сети много примеров, но не понятно как с конкретной датой работать.
Буду благодарен пояснениям)

Пока имеется такой код :
Кликните здесь для просмотра всего текста

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Intent notificationIntent = new Intent(context, ToDoActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);
 
Notification.Builder builder = new Notification.Builder(context);
 
builder.setContentIntent(contentIntent)
         .setSmallIcon(R.drawable.ic_launcher)
         // Создаем оповещение сразу после добавления таска в приложении
         .setWhen(System.currentTimeMillis())
         .setContentTitle("Напоминание MyNotes")
         .setContentText(description);
 
Notification notification = builder.build();
notification.defaults = Notification.DEFAULT_SOUND;
 
NotificationManager notificationManager = (NotificationManager) context
        .getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(Integer.parseInt(id), notification);


Добавлено через 54 минуты
Ошибочка вышла, метод .setWhen(System.currentTimeMillis()) работает не так, как ожидалось, он просто выводит дату в окошко оповещения, я то думал он время оповещения задаёт..
Ответ: Смотрел и в сторону AlarmManager, но как-то что-то..)
Ещё видел вариант через TimerTask сделать, но тоже не обошлось без ошибок

В случае, когда в timer.schedule() вторым параметром передаю задержку просто числом, всё работает но если задержку считать как разность дат в милисекундах thatDay.getTimeInMillisec() - System.currentTimeInMillisec(), получаю исключение delay < 0, даже если таск через минуту запланирован.

Если передаю вторым параметром thatDay.getTime(), то оповещение сразу приходит..
Может с датой и временем что-то не так.. Они строками заданы ("26/12/2015", "15:00")

Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                thatDay.set(Calendar.DAY_OF_MONTH, Integer.parseInt(date.substring(0, 2)));
                thatDay.set(Calendar.MONTH, Integer.parseInt(date.substring(3, 5)));
                thatDay.set(Calendar.YEAR, Integer.parseInt(date.substring(6,10)));
                thatDay.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time.substring(0, 2)));
                thatDay.set(Calendar.MINUTE, Integer.parseInt(time.substring(3, 5)));
 
                Intent notificationIntent = new Intent(context, ToDoActivity.class);
                notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
                PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent,
                        PendingIntent.FLAG_CANCEL_CURRENT);
 
                Notification.Builder builder = new Notification.Builder(context);
 
                builder.setContentIntent(contentIntent)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setWhen(System.currentTimeMillis())
                        .setContentTitle("Напоминание MyNotes")
                        .setContentText(description);
 
                Notification notification = builder.build();
                notification.defaults = Notification.DEFAULT_SOUND;
 
                NotificationManager notificationManager = (NotificationManager) context
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Integer.parseInt(id), notification);
Вопрос: Как реализовать отслеживание изменения даты в android?

В БД есть записи которые должны в программе изменятся в зависимости от текущей даты. То есть менять позицию в ExpandableListView в зависимости от того какая сейчас дата.

Не знаю как можно реализовать отслеживание изменения даты.


Вопрос:

Как в Android можно реализовать отслеживание изменения даты??
Ответ:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
Date date = new Date();
 
textViewInfo.setText(date.toString());
две даты надо, потом сравнить
Вопрос: ListView с датами

Есть дата рождения(выбирается пользователем через DialogDatePicker), отталкиваясь от нее нужно рассчитать на перед расписание прививок по определенным дня(их дату) и добавить их в ListView. Как можно сделать?
Ответ: делается так. у лист вью скорее всего есть адаптер, в адаптере пишете функцию, addNewDate а в ней добавляете в лист который обрабатывает адаптер новую дату и делаете notifyDataSetChanged();

функция в адапетере примерно будет выглядеть так, псевдокод:
Java
1
2
3
4
public void addNewDate(Date date){
mDatesList.add(date);   // mDatesList - изначальный лист адаптера, может быт так же например массив
notifyDataSetChanged();
}
из класса в котором адаптер пишете так :
Java
1
mAdapter.addNewDate(date)
Вопрос: Вывести текущую дату и время в определенном формате

Добрый день! Подскажите как вывести отдельным стрингом время в формате "15:02" и дату в формате "3-10-17"
Ответ: Date today = new Date();

//дата
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
String date = DATE_FORMAT.format(today);

//Время
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String time = DATE_FORMAT.format(today);
Вопрос: Получить TimeZone по дате

Добрый вечер. Нужно получить разницу во времени (TimeZone offset) , например если в Москве 2 часа дня то в Торронто 10 часов утра, т.е разница -4. это просто но если в Торронто перевели часы на час назад и разница стала -5 , а в Москве не перевели. а нужна разница которая была в конкретный день, например они перевели часы 12 марта, до была разница 4 , после стала 5 часов. как получить эту разницу правельно относительно даты? т.е. до 12 марта -4, после -5.
Java
1
2
3
TimeZone.getTimeZone("GMT")
или
TimeZone.getTimeZone("UTC")
выдаст только разницу на данный момент
спасибо
Ответ:

Не по теме:

аминь

Вопрос: Проясните разницу между CompatActivity, Support Library, SDK version и некоторыми другими параметрами

Доброго дня.
Путаюсь и не до конца понимаю смысл некоторых параметров проектов Android, типов классов, версий библиотек и других параметров, а главное их влияния друг на друга.

1. При добавлении активити можно выбрать "Backwards Compability (AppCompat)". По смыслу переводится как "обратная совместимость", т.е. как правильно понимаю возможность работы этой конкретной активити на старых версиях Android? А на сколько старых?

2. Второй вопрос вытекает из первого - разница в результате (сначала) будет только в том, от кого унаследован класс этой Активити - просто от Activity или от AppCompatActivity?
Что будет если я буду использовать Activity?

3. Что "ПОДДЕРЖИВАЮТ" библиотеки android.support.v4 и android.support.v7? Виджеты, элементы View и др. компоненты могут быть представлены как в android.app так и в вышеописанных библиотеках (или только в одной из них, в v7). Если необходимый класс присутствует то откуда его лучше импортировать? Какая разница между 4 и 7, с чем вообще соотносятся эти версии? Бывает вроде работает и так и так.

4. В build.gradle есть параметры (пример)
Код
compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
minSdkVersion - это то значение, которое видимо выставится при создании проекта, там где можно указать Minimum SDK. Насколько критично проваливаться в прошлое, в старые версии SDK? Это вообще на что-нибудь влияет и связало ли как-то с классом AppCompatActivity и support-библиотеками?
А разница между compileSdkVersion, buildToolsVersion и targetSdkVersion тогда ещё мешьше ясна. Мы можем тут изменять версию компилятора, утилит сборки и ещё в добавок можем указать целевую версию SDK? Зачем всё это, тонкости не очевидны когда и при каких обстоятельствах эти значения могут быть разными? И насколько разными, главное не ниже minSdkVersion?

Буду очень признателен если кто-нибудь в общих чертах опишет взаимосвязи а то клубок непонятных знаний никак не распутывается.
Ответ:
Сообщение от Nedoluga
Совместимость с определенными инструментами
А, т.е. термин support ("поддержка") обозначает расширение инструментария но никак не глубину совместимости со старыми версиями SDK! Т.е. support и MinSDK/BackwardCompability термины из разных и не влияющих друг на друга плоскостей.
Вопрос: Как правильно поставить минимальную дату

У меня две кнопки. Первый вылета, второй прилета. У даты вылета minDate = today. А у даты прилета minDate должна быть равной выбранной дате на вылета.

В onCreate():

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
final Calendar nextYear = Calendar.getInstance();
        nextYear.add(Calendar.YEAR, 1);
 
        Date today = new Date();
        Date departs;
 
        initButtonListeners(today, nextYear);
Сами клики:

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void initButtonListeners(final Date today, final Calendar nextYear) {
        findViewById(id.linearCalendar).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showCalendarInDialog("Выберите дату вылета", R.layout.calendar_dialog_customized);
 
                    dialogView.init(today, nextYear.getTime())
                            .withSelectedDate(new Date(departData));
 
            }
        });
 
        findViewById(id.linearArrive).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showCalendarInDialog("Выберите дату прилета", R.layout.calendar_dialog_customized);
 
                Date dates = null;
 
                    SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
                    try {
                        dates = format.parse(departData);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    dialogView.init(dates, nextYear.getTime())
                            .withSelectedDate(new Date(arriveData));
                }
 
            }
        });
 
    }

OnDateClickListener:

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dialogView.setOnDateSelectedListener(new CalendarPickerView.OnDateSelectedListener() {
            DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy");
 
            @Override
            public void onDateSelected(Date date) {
                if(isFrom){
                    departData = dateFormat.format(date);
                    tvDepart.setText(departData);
                }else{
                    arriveData = dateFormat.format(date);
                    tvArrive.setText(arriveData);
                }
 
                theDialog.dismiss();
 
            }
 
            @Override
            public void onDateUnselected(Date date) {
 
            }
 
        });
При клике Прилета, вылетает приложение, говорит о нулевом значении

Ошибка:

java.lang.IllegalArgumentException: The string argument is null
at java.util.Date.parse(Date.java:373)
at java.util.Date.<init>(Date.java:149)
at com.tezz.MainContent.ContentActivity$2.onClick(ContentActivity.java:305)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)



Вопрос:

Что не правильно, как поставить minDate?
Ответ: ContentActivity.java:305
Вопрос: Как ввести свою дату в андроид

Добрый вечер.
Задача такая: нужно ввести дату (например дня рождения) и посчитать сколько прошло дней, то бишь сколько дней живешь.
План такой: текущую дату перевожу в миллисекунды, дату рождения перевожу в миллисекунды, вычитаю и перевожу в дни.

Вопрос: как ввести свою дату?) Никак не могу понять)

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

Java
1
2
3
4
String date = "23.01.2015";
                    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
                    Date myDate = dateFormat.parse(date);
                    long d = myDate.getTime();
Ответ:
Сообщение от Паблито
final Calendar c = getInstance(); c.set(year, monthOfYear, dayOfMonth); long ms = System.currentTimeMillis() - c.getTimeInMillis(); long days = TimeUnit.MILLISECONDS.toDays(ms);
Сообщение от xaat
Calendar testCalendar = getInstance(); testCalendar.set(year, monthOfYear, dayOfMonth); long millisDiff = Calendar.getInstance().getTimeInMillis() - testCalendar.getTimeInMillis(); long daysDiff = TimeUnit.MILLISECONDS.toDays(millisDiff);
найди 10 отличий
Вопрос: Неправильный выбор даты в приложении для Android

Добрый день! Я делаю приложение в Android Studio, и в нем мне необходим был диалог для выбора даты. Я создал данный диалог, он работает, все нормально. НО, когда я выбираю в нем дату и устанавливаю её в TextBox, нумерация месяца сбивается, и показывается предыдущий месяц.
К примеру, выбираю дату "6 декабря 2015 года". В теории, должно установиться значение 6.12.2015, но устанавливается почему-то 6.11.2015. Подскажите, в чем может быть проблема, и как это исправить?
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class DatePicker extends DialogFragment
            implements DatePickerDialog.OnDateSetListener {
 
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
 
            // определяем текущую дату
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);
 
            // создаем DatePickerDialog и возвращаем его
            Dialog picker = new DatePickerDialog(getActivity(), this,
                    year, month, day);
            picker.setTitle(getResources().getString(R.string.choose_date));
 
            return picker;
        }
 
        @Override
        public void onStart() {
            super.onStart();
            Button nButton =  ((AlertDialog) getDialog())
                    .getButton(DialogInterface.BUTTON_POSITIVE);
            nButton.setText(getResources().getString(R.string.ready));
 
        }
 
        @Override
        public void onDateSet(android.widget.DatePicker datePicker, int year,
                              int month, int day) {
 
            TextView tv = (TextView) getActivity().findViewById(R.id.textView19);
            tv.setText(day + "-" + month + "-" + year);
        }
    }

Вот скриншоты того, что получается при выборе
Ответ: При выборе Декабря - 11.
Я сделал перед 35-ой строкой увеличение month на еденицу, и теперь показывает правильно: при выборе того же декабря - 12, январь - 1 и т.д.
По другому нумерацию с 0 в датапикере обойти не получится?