Страницы

Поиск по вопросам

Показаны сообщения с ярлыком calendar. Показать все сообщения
Показаны сообщения с ярлыком calendar. Показать все сообщения

понедельник, 24 февраля 2020 г.

Метки на CalendarView

#java #android #calendar


Возможно ли на стандартном CalendarView как-нибудь поставить метки (точки под числом)
на определённые дни? Либо может есть какая-нибудь библиотечка с календарём, похожим
на стандартный?
    


Ответы

Ответ 1



Можно использовать MaterialDateTimePicker Если есть необходимость выделить определенные дни, то можно воспользоваться методом: setHighlightedDays(Calendar[] days) По умолчанию дни выделятся полужирным шрифтом, однако можно так же изменить и цвет шрифта. They will be rendered in bold. You can tweak the color of the highlighted days by overwriting mdtp_date_picker_text_highlighted Если же, если вы хотите выделением хотите подсказать пользователю, что только данные дни могут быть выбраны, то можно воспользоваться методом: setSelectableDays(Calendar[] days)

четверг, 13 февраля 2020 г.

Как добавить один день к Date

#java #android #calendar


Date departDate;

calendar.init(departDate, nextYear.getTime())
                    .withSelectedDate(dep);


У меня departDate может взять любую дату, то есть неизвестная у него дата, мне нужно
добавить к нему один день. departDate + 1 никак не помогает. 

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date dep1 = cal.getTime();


departDate + dep1 тоже не помогает. 

Как в данном случае добавить один день и вообще как добавить день к Date???
    


Ответы

Ответ 1



Вместо cal.add(Calendar.DAY_OF_MONTH, 1); используй метод cal.add(Calendar.DATE, 1);

Ответ 2



Ваш код делает точно то, что вы написали, а именно добавляет один день к текущей дате, т.к. Calendar.getInstance() возвращает текущую дату. Если вам надо добавить что-то к определенной дате, то сначала ее необходимо установить в календарь, а потом прибавлять значение: Calendar instance = Calendar.getInstance(); instance.setTime(date); //устанавливаем дату, с которой будет производить операции instance.add(Calendar.DAY_OF_MONTH, 3);// прибавляем 3 дня к установленной дате Date newDate = instance.getTime(); // получаем измененную дату

пятница, 31 января 2020 г.

Java. Вычисление прошедших лет, месяцев и дней между двумя датами

#java #datetime #calendar


Добрый день. Даны интервалы дат, например: 28.01.2009 - 05.03.2013. Стоит задача
высчитать точное количество полных лет, месяцев и дней в этом промежутке. Подскажите
как это сделать?

Просто количество дней нахожу так

    Date startDate = new SimpleDateFormat("dd.MM.yyyy").parse(s1);
    Date endDate = new SimpleDateFormat("dd.MM.yyyy").parse(s2);

    Calendar calendarStart = Calendar.getInstance();
    calendarStart.setTimeInMillis(startDate.getTime());

    Calendar calendarEnd = Calendar.getInstance();
    calendarEnd.setTimeInMillis(endDate.getTime());

    long difference = calendarEnd.getTimeInMillis() - calendarStart.getTimeInMillis();
    long days = difference /(24* 60 * 60 * 1000);

    System.out.println(days);


Результат надо представить в виде: Лет: 7, Месяцев: 5, Дней: 10
    


Ответы

Ответ 1



Всё довольно просто с использованием классов пакета java.time.* (в Java 8 и новее): DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); LocalDate startDate = LocalDate.parse("28.01.2009", formatter); LocalDate endDate = LocalDate.parse("05.03.2013", formatter); Period period = Period.between(startDate, endDate); System.out.println(period.getYears()); // 4 System.out.println(period.getMonths()); // 1 System.out.println(period.getDays()); // 5

Ответ 2



Посмотрите аналогичные обсуждения по ссылкам. Как высчитать ближайшие дни рождения с помощью LocalDate? Calculating the difference between two Java date instances Calculating days between two dates with Java

суббота, 11 января 2020 г.

java Calendar возвращает неправильный день недели

#java #дата #calendar


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

Для примера:

GregorianCalendar calendar1 = new GregorianCalendar(196, 0, 1);
System.out.println(calendar1.get(GregorianCalendar.DAY_OF_WEEK));


Результатом в выводе будет 5, хотя по календарю: 01 января 196 - пятница, а значит
мы должны были получить значение 6. Такая же проблема с годами:


1036 (1 января - воскресенье, а возвращает 5)
1316 (1 января - среда, а возвращает 5) 
1456 (1 января - вторник, а возвращает 5)


и др.

Но иногда возвращает и правильные значения. Например:

GregorianCalendar calendar2 = new GregorianCalendar(1600, 0, 1);
System.out.println(calendar2.get(GregorianCalendar.DAY_OF_WEEK));


вернет 7, и по календарю это суббота.
    


Ответы

Ответ 1



Отвечу сам на собственный вопрос. Такая неразбериха с календарями получилась из-за отличий Григорианского и Юлианского календарей. В Юлианском календаре високосный год наступает каждый год, который кратный 4, а в Григорианском - високосными считаются года, которые делятся на 4, но не кратные 100 (за исключением годов, которые делятся на 400). Это означает, что постепенно разница между этими календарями увеличивается на 3 дня каждые 400 лет. Т.к. на Григорианский практически все страны перешли только с 1582 года, то до этого времени все ресурсы и языки программирования (помимо Java сравнивал еще с Python) по-своему высчитывают этот период. Что касается Java, то, как я понял, до 1582 года включительно в языке используется Юлианский календарь, а с 1583 - Григорианский.

Ответ 2



Есть еще один нюанс про который забывает ТС: Calendar defines a locale-specific seven day week using two parameters: the first day of the week and the minimal days in first week (from 1 to 7). These numbers are taken from the locale resource data when a Calendar is constructed. They may also be specified explicitly through the methods for setting their values. Грубо говоря номер дня недели зависит от выбранной локали. В русском календаре первый день недели - понедельник, в западной традиции первый день недели воскресенье.

пятница, 10 января 2020 г.

Android Как получить время, отображаемое в StatusBar

#java #android #время #calendar #timezone


Здравствуйте! 

Некоторые пользователи при переходе на постоянное зимнее время отключили синхронизацию
времени и часового пояса по сети и вручную перевели время на час назад. 

Сейчас у них на телефонах, к примеру, установлен часовой пояс, в котором 14:00, а
на телефоне отображается текущее время 13:00. 

При получении времени методами 

System.currentTimeMillis(), Calendar.getInstance().getTimeInMillis()


возвращает 14:00. Как получить время пользователя правильно?
    


Ответы

Ответ 1



Всё, что я смог найти, сведено вот в этот пост. Резюме: без использования дополнительных запросов к серверу и/или получения собственных координат (которые не всегда могут быть доступны), невозможно получить необходимую разницу во времени. Это же относится и к отменённому летнему времени: часть устройств всё ещё считает, что летом часовой пояс Москвы GMT+4, часть - уже знает, что GMT+3. И кроме запроса на сервер в общем случае никаким образом их не синхронизировать.

Ответ 2



Нет возможности проверить, но думаю нужно получить таймзону и посчитать с ней? TimeZone tz = TimeZone.getDefault(); или попробовать другой способы: Time now = new Time(); now.setToNow(); http://developer.android.com/reference/android/text/format/Time.html

Ответ 3



Calendar.getInstance().getTimeInMillis() возвращает количество миллисекунд в часовом поясе UTC. Как вы проверяете что это соответвует 14:00? Может быть, пользователь не переводил время, а поставил себе соседний часовой пояс? В любом случае попробуйте проверить какой час возвращается если использовать Calendar.getInstance().get(Calendar.HOUR_OF_DAY)

суббота, 4 января 2020 г.

Установить дату методом, принимающем день, месяц и год

#java #дата #calendar


Перерыл кучи документации и понял, что для работы с датой лучше всего использовать
Calendar. Но возник такой вопрос: возможно ли в JAVA задать нужную дату напрямую без
лишних преобразований, что-то по типу myDate.set("28.12.2016"); ну или через запятую?

Подскажите, в какую сторону копать либо киньте примеры (именно на установку даты
и ее извлечение).

P.S. Пишу консольное приложение, ввод даты осуществляется пользователем вручную.
    


Ответы

Ответ 1



Как я понимаю, нужный тебе метод тут Calendar calendar = Calendar.getInstance(); calendar.set(2016, 6, 10); Для отображения даты используйте SimpleDateFormat Например: SimpleDateFormat dayFormat = new SimpleDateFormat("EEE, d MMMM", Locale.getDefault()); String myString = dayFormat.format(calendar.getTime()); Задавайте нужный паттерн для вывода даты, в примере выше результат будет "Вс, 12 июня" А при вводе от пользователя ничто Вам не мешает минусить на единицу введеный месяц. Комментарий от @zRrr: SimpleDateFormat умеет разбирать строки с датами, примерно так: Date date = new SimpleDateFormat( "dd.MM.yyyy" ).parse( "28.12.2016" ); и так лучше разбирать пользовательский ввод, если формат даты в строке известен.

Ответ 2



Calendar c = Calendar.getInstance(); c.set(year, month, day); //вводим дату SimpleDateFormat format1 = new SimpleDateFormat("MMMM dd yyyy", Locale.ENGLISH); String formatted = format1.format(c.getTime());

пятница, 27 декабря 2019 г.

Как правильно повернуть календарь?

#java #android #calendar #locale


Я не уверен, что мой подход правильный может есть другая идея?

Мне нужно имплементировать календарь в своем приложении с возможностью Range selection
по датам.

Я для этого решил одну из самых популярных библиотек применить

https://github.com/prolificinteractive/material-calendarview

так как знаю, что Calendar View не приспособлен для Range selection

И все работает отлично пока не нужно поменять язык приложения с Английского на Иврит
(так же как и Арабский слева направо)

Название месяцев меняется название дней недели тоже, но не меняется направление последовательности
(оно тоже должно быть не rtl - cправа налево , а ltr - слева направо)

Вот скрин на англ 



Вот как на иврите android:supportsRtl="false"



И тут тоже на иврите но android:supportsRtl="true" (не знаю почему но кроме того,
что поменялось направление стрелок больше ничего)



Я нашел такой баг фикс как раз об этом 

https://github.com/prolificinteractive/material-calendarview/pull/573

Это как раз то, что мне нужно, согласно этому фиксу направление должно меняться,
но в моем случае видно, что это не так.

Что я делаю не так или подскажите, как можно это решить по другому?
    


Ответы

Ответ 1



Вы можете использовать форк этого репозитория от того кто сделал этот коммит: https://github.com/anasanasanas/material-calendarview Придется использовать JitPack В принципе, все предельно просто описано и на странице: 1 Пропишите: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 2 Добавьте: dependencies { ... compile 'com.github.anasanasanas:material-calendarview:1.4.4' } Реультат:

четверг, 19 декабря 2019 г.

Как получить название текущего месяца на русском?

#java #android #calendar


mSelectMonth = (TextView)view.findViewById(R.id.select_month);
Calendar calendar = Calendar.getInstance();
mSelectMonth.setText(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT,
Locale.ENGLISH));


Так выводим на английском, а как сделать русский?
    


Ответы

Ответ 1



Использовать русскую локаль вместо английской: Calendar calendar = Calendar.getInstance(); String month = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT, new Locale("ru")); Вывод на экран: августа Если нужны нестандартные названия месяцев, то придётся создать массив с ними: String[] monthNames = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" }; String month = monthNames[calendar.get(Calendar.MONTH)]; Август

Ответ 2



Calendar cal = Calendar.getInstance(); String month = new SimpleDateFormat("MMMM", new Locale("ru")).format(cal.getTime());

Ответ 3



Добавлю свои 5 копеек: Использовать русскую локаль вместо английской Не все Android аппараты поддерживают русскую локаль. Если требуется универсальная поддержка русской локали для всех аппаратов, то надо использовать либу ICU4J, которая цепляется через LocaleServiceProvider

четверг, 2 мая 2019 г.

Метки на CalendarView

Возможно ли на стандартном CalendarView как-нибудь поставить метки (точки под числом) на определённые дни? Либо может есть какая-нибудь библиотечка с календарём, похожим на стандартный?


Ответ

Можно использовать MaterialDateTimePicker
Если есть необходимость выделить определенные дни, то можно воспользоваться методом:
setHighlightedDays(Calendar[] days)
По умолчанию дни выделятся полужирным шрифтом, однако можно так же изменить и цвет шрифта.
They will be rendered in bold. You can tweak the color of the highlighted days by overwriting mdtp_date_picker_text_highlighted

Если же, если вы хотите выделением хотите подсказать пользователю, что только данные дни могут быть выбраны, то можно воспользоваться методом:
setSelectableDays(Calendar[] days)

вторник, 23 апреля 2019 г.

Как добавить один день к Date

Date departDate;
calendar.init(departDate, nextYear.getTime()) .withSelectedDate(dep);
У меня departDate может взять любую дату, то есть неизвестная у него дата, мне нужно добавить к нему один день. departDate + 1 никак не помогает.
Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, 1); Date dep1 = cal.getTime();
departDate + dep1 тоже не помогает.
Как в данном случае добавить один день и вообще как добавить день к Date???


Ответ

Вместо cal.add(Calendar.DAY_OF_MONTH, 1); используй метод cal.add(Calendar.DATE, 1);

вторник, 2 апреля 2019 г.

Java. Вычисление прошедших лет, месяцев и дней между двумя датами

Добрый день. Даны интервалы дат, например: 28.01.2009 - 05.03.2013. Стоит задача высчитать точное количество полных лет, месяцев и дней в этом промежутке. Подскажите как это сделать?
Просто количество дней нахожу так
Date startDate = new SimpleDateFormat("dd.MM.yyyy").parse(s1); Date endDate = new SimpleDateFormat("dd.MM.yyyy").parse(s2);
Calendar calendarStart = Calendar.getInstance(); calendarStart.setTimeInMillis(startDate.getTime());
Calendar calendarEnd = Calendar.getInstance(); calendarEnd.setTimeInMillis(endDate.getTime());
long difference = calendarEnd.getTimeInMillis() - calendarStart.getTimeInMillis(); long days = difference /(24* 60 * 60 * 1000);
System.out.println(days);
Результат надо представить в виде: Лет: 7, Месяцев: 5, Дней: 10


Ответ

Всё довольно просто с использованием классов пакета java.time.* (в Java 8 и новее):
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); LocalDate startDate = LocalDate.parse("28.01.2009", formatter); LocalDate endDate = LocalDate.parse("05.03.2013", formatter); Period period = Period.between(startDate, endDate); System.out.println(period.getYears()); // 4 System.out.println(period.getMonths()); // 1 System.out.println(period.getDays()); // 5

понедельник, 4 марта 2019 г.

java Calendar возвращает неправильный день недели

При программировании на java столкнулся с проблемой, что календарь не всегда правильно возвращает день недели. Пробовал использовать как Calendar, так и GregorianCalendar, но результат одинаковый.
Для примера:
GregorianCalendar calendar1 = new GregorianCalendar(196, 0, 1); System.out.println(calendar1.get(GregorianCalendar.DAY_OF_WEEK));
Результатом в выводе будет 5, хотя по календарю: 01 января 196 - пятница, а значит мы должны были получить значение 6. Такая же проблема с годами:
1036 (1 января - воскресенье, а возвращает 5) 1316 (1 января - среда, а возвращает 5) 1456 (1 января - вторник, а возвращает 5)
и др.
Но иногда возвращает и правильные значения. Например:
GregorianCalendar calendar2 = new GregorianCalendar(1600, 0, 1); System.out.println(calendar2.get(GregorianCalendar.DAY_OF_WEEK));
вернет 7, и по календарю это суббота.


Ответ

Отвечу сам на собственный вопрос.
Такая неразбериха с календарями получилась из-за отличий Григорианского и Юлианского календарей. В Юлианском календаре високосный год наступает каждый год, который кратный 4, а в Григорианском - високосными считаются года, которые делятся на 4, но не кратные 100 (за исключением годов, которые делятся на 400). Это означает, что постепенно разница между этими календарями увеличивается на 3 дня каждые 400 лет.
Т.к. на Григорианский практически все страны перешли только с 1582 года, то до этого времени все ресурсы и языки программирования (помимо Java сравнивал еще с Python) по-своему высчитывают этот период.
Что касается Java, то, как я понял, до 1582 года включительно в языке используется Юлианский календарь, а с 1583 - Григорианский.

пятница, 1 февраля 2019 г.

Установить дату методом, принимающем день, месяц и год

Перерыл кучи документации и понял, что для работы с датой лучше всего использовать Calendar. Но возник такой вопрос: возможно ли в JAVA задать нужную дату напрямую без лишних преобразований, что-то по типу myDate.set("28.12.2016"); ну или через запятую?
Подскажите, в какую сторону копать либо киньте примеры (именно на установку даты и ее извлечение).
P.S. Пишу консольное приложение, ввод даты осуществляется пользователем вручную.


Ответ

Как я понимаю, нужный тебе метод тут
Calendar calendar = Calendar.getInstance(); calendar.set(2016, 6, 10);
Для отображения даты используйте SimpleDateFormat
Например:
SimpleDateFormat dayFormat = new SimpleDateFormat("EEE, d MMMM", Locale.getDefault()); String myString = dayFormat.format(calendar.getTime());
Задавайте нужный паттерн для вывода даты, в примере выше результат будет "Вс, 12 июня"
А при вводе от пользователя ничто Вам не мешает минусить на единицу введеный месяц.
Комментарий от @zRrr:
SimpleDateFormat умеет разбирать строки с датами, примерно так:
Date date = new SimpleDateFormat( "dd.MM.yyyy" ).parse( "28.12.2016" ); и так лучше разбирать пользовательский ввод, если формат даты в строке известен.

понедельник, 3 декабря 2018 г.

Как правильно повернуть календарь?

Я не уверен, что мой подход правильный может есть другая идея?
Мне нужно имплементировать календарь в своем приложении с возможностью Range selection по датам.
Я для этого решил одну из самых популярных библиотек применить
https://github.com/prolificinteractive/material-calendarview
так как знаю, что Calendar View не приспособлен для Range selection
И все работает отлично пока не нужно поменять язык приложения с Английского на Иврит (так же как и Арабский слева направо)
Название месяцев меняется название дней недели тоже, но не меняется направление последовательности (оно тоже должно быть не rtl - cправа налево , а ltr - слева направо)
Вот скрин на англ

Вот как на иврите android:supportsRtl="false"

И тут тоже на иврите но android:supportsRtl="true" (не знаю почему но кроме того, что поменялось направление стрелок больше ничего)

Я нашел такой баг фикс как раз об этом
https://github.com/prolificinteractive/material-calendarview/pull/573
Это как раз то, что мне нужно, согласно этому фиксу направление должно меняться, но в моем случае видно, что это не так.
Что я делаю не так или подскажите, как можно это решить по другому?


Ответ

Вы можете использовать форк этого репозитория от того кто сделал этот коммит:
https://github.com/anasanasanas/material-calendarview
Придется использовать JitPack
В принципе, все предельно просто описано и на странице:
1 Пропишите:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
2 Добавьте:
dependencies { ... compile 'com.github.anasanasanas:material-calendarview:1.4.4' }
Реультат:

вторник, 30 октября 2018 г.

Как получить название текущего месяца на русском?

mSelectMonth = (TextView)view.findViewById(R.id.select_month); Calendar calendar = Calendar.getInstance(); mSelectMonth.setText(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT, Locale.ENGLISH));
Так выводим на английском, а как сделать русский?


Ответ

Использовать русскую локаль вместо английской:
Calendar calendar = Calendar.getInstance(); String month = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT, new Locale("ru"));
Вывод на экран:
августа

Если нужны нестандартные названия месяцев, то придётся создать массив с ними:
String[] monthNames = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" }; String month = monthNames[calendar.get(Calendar.MONTH)];
Август