Работа с датой

  • 10
  • Недоступна
Станция Небула-1 принимает звездолёты только по нечётным дням стандартного земного года (когда количество дней с начала года — нечётно). Выясним, можем ли мы сегодня отдохнуть на Небуле-1. Для этого реализуем метод isDateOdd(String date), возвращающий true, если количество дней с начала года — нечётное число, иначе false.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (364)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Андрей10 уровень, Москва
понедельник, 08:28
Снова просрал попытку потому, что невнимательно прочитал ТЗ и вместо "!=" поставили "=="🤬
Sergei Fedorov12 уровень, Санкт-Петербург
23 июля, 12:45
через SimpleDateFormat и шаблона "D" получил строку с текстом "121" перевел в инт дальше if-else
NEURO MANT8 уровень, Белая Церковь
вчера, 16:18
Можешь показать код? Я изначально хотел сделать так же, но не понял как
18 июля, 00:47
Очень жаль, что эта тема на juvarush печально объяснена. Для начала, нужно понимать что есть устаревший и неудобный Date и его более современная замена Calendar, сразу ориентируйтесь на календарь. Calendar cal = Calendar.getInstance(); //записывает в cal текущую дату, не смог найти как создать пустой календарь, видимо объект этого типа нельзя создать без значения SimpleDateFormat sdf = new SimpleDateFormat("MMM d yyyy", Locale.ENGLISH); //SimpleDateFormat это класс который позволяет переводить строку в дату и наоборот, в скобочках указывают паттерн, то есть то, в какой форме передается строка, если было бы например 21.02.2020 то было бы dd.MM,yyyy, locale указывает на часовой пояс, но тут лучше во всех задачах на javarush указываь именно ENGLISH для того, чтобы указывать что-то кроме дня месяц и года, например время суток, эру и т.д. вот тут есть табличка ( https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html ) и там же чуть ниже табличка с примерами. Для тех кто хочет реально разобраться, советую прочитать всё целиком хотя бы с гугл переводчиком. cal.setTime(sdf.parse(date)); // преобразует объект simpledateformat и заносит время в календарь работа с календарем довольно проста и расписана в одной из лекций этого уровня у профессора, можете просто загуглить date calendar javarush. Тут нужно будет добавить исключения, просто соглашайтесь с идеей пока, а исключения будут в следующих лекциях
18 июля, 00:50
int day_of_year = cal.get(Calendar.DAY_OF_YEAR);//для совсем ленивых копипастеров, но знайте, что если не разберетесь с вопросом, то он будет клевать вас в зад еще очень долго
Алексей15 уровень, Минск
21 июля, 13:54
Не знаю даже как сформулировать вопрос... но мое решение очень похоже на ваш вариант. Поэтому пишу вам. Вроде все правильно работает, но валидатор не принимает. Просит протестировать с разными датами. Прогнал кучу вариантов -- вроде все верно. Високосный год 366 дней, обычный год -- 365 дней. Схем такая: решал через Calendar и SimpleDateFormat
calendar.setTime(sdf.parse(date)); // установили дату в календарь. По-сути нам нужен только год.
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DAY_OF_MONTH, 31); \\выставили на календаре 31 декабря
далее через get(Calendar.DAY_OF_YEAR) получаю число дней в году. (так как на календаре 31 декабря) Потом проверяю на четность и возвращаю true/false. Валидатор не принимает решение. Я проверил несколько десятков дат. Мой результат: високосный год 366 дней (false), обычный год -- 365 дней(true). Может кто-то знает как угодить валидатору? Или может я не правильно понял условие?
Алексей15 уровень, Минск
21 июля, 14:16
Отбой. Разобрался. Не правильно понял условие. Не "количество дней в году", а "количество дней с начала года" . Перемудрил))
Кирилл12 уровень, Москва
22 июля, 15:06
а зачем вы парсите???
23 июля, 11:58
чтобы преобразовать date в календарь, мне с ним удобнее работать
Юрий14 уровень, Москва
16 июля, 06:59
Вариант решения бе использования библиотеки календарь! 1. Полученную дату разбиваем на массив, последний элемент - год 2. Считываем дату через SimpleDateFormat (конечная дата) 3. Получаем количество миллисекунд с введенной даты 4. Создаем String с 1 января + год из первого пункта.(Начальная дата) 5. Считываем начальную дату через SimpleDateFormat и получаем количество миллисекунд. 6. Получаем разницу между конечной датой и начальной датой, и делим ее на на количество миллисекунд в дне. Это будет количество дней с начала года. 7. Так как 1 января нечетное, следовательно если количество дней с начала года четное, то возвращаем true иначе false. Метод так себе, так как при наличии времени, можем получить проблемы с делением в 6 пункте. Но на датах работает.
Олесь10 уровень, Санкт-Петербург
7 июля, 08:12
Cчитываем дату через SimpleDateFormat(MMMM d yyyy, Locale.ENGLISH);Вводим новый SimpleDateFormat("D") - он вычисляет номер дня в году. Форматируем нашу дату через этот новый формат. Переводим в правильный тип. Проверяем на четность. Прописываем исключения (Спасибо комментатору Nikolai за эту подсказку).
Сергей Климович14 уровень, Минск
8 июля, 18:41
А можно подробнее?
Олесь10 уровень, Санкт-Петербург
11 июля, 07:33
Весь код, что ли написать?
Антон15 уровень, Санкт-Петербург
4 июля, 18:21
Решил сам. Несколько примитивно и коряво, но тем не менее. С помощью метода split делим строку на массив из 3 строк. Создаем int x = 0. Далее идет блок условных операторов по определению месяцев с помощью equals. Найдя нужный, присваиваем "х" сумму дней всех прошедших месяцев (к примеру для MARCH 31 (январь)+28(февраль)). 2 и 3 элемент массива строк переводим в int. Второй элемент - это количество дней, прошедших с начала месяца. В итоге: сумма дней предшествующих + дней прошедших в текущем месяце позволяет вычислить четный день в году или нечетный. Но валидатор решение не ест. Почему? Потому что не учтено високосный год или нет. По третьему элементу вычисляем високосный год или нет.
if (x>59 && (z%4==0 && !(z%100==0 && !(z%400==0))))
          x+=1;
если год високосный и сумма дней предшествующих месяцев >59 (то есть больше 28 февраля), то прибавляем один день. Все. Задача решена, пусть и довольно примитивно...
Nikolai9 уровень, Санкт-Петербург
29 июня, 19:29
Впервые выкладываю свой коммент, возможно кому-то будет полезен. Задача на первый взгляд оказалась трудной, но гуглежка и чтение мануалов по классам Calendar (https://docs.oracle.com/javase/7/docs/api/java/util/Calendar); SimpleDateFormat (http://www.seostella.com/ru/article/2012/02/05/formatirovanie-daty-v-java.html) помогло решить ее. а) случайно наткнулся на метод get(Calendar.DAY_OF_YEAR), который и привел на верный путь, подсказав, что нужно перевести нашу date к формату класса Calendar. б) метод выводит порядковое число дня в году, которое уже можно проверить на четность/нечетность 1) создадим объект Calendar cal = Calendar.getInstance(); (getInstance сразу запишет текущую дату) 2) создадим объект SimpleDateFormat. Не забудьте указать паттерн, как в условиях задачи ("MMMMM d yyyy", Locale.ENGLISH), и ВАЖНО: укажите Locale.ENGLISH, для русскоязычных версий (винды, видимо?) текущая дата хранится в русскоязычном виде. 3) Самое сложное. Нужно было как-то записать передаваемый параметр date в формат Calendar. Спасло следующее: cal.setTime(имя_объекта_СимплДейтФормат.parse(date)). Метод setTime укажет для Calendar текущей дату класса Date, к этому формату мы ее приводим при помощи парсинга нашей строки date. 4) return : наша проверка четности и нечетности из пунктов а+б. P.S. IDEA ругается на метод parse, предупреждая об ошибке ParseException, решается добавлением этого исключения в сигнатуры методов main и isDateOdd. Если кто-то объяснит, почему может возникать данная ошибка, буду благодарен.
Юрий10 уровень
30 июня, 18:29
решил также 1 в 1.
Vsevolod Krupin13 уровень, Санкт-Петербург
6 июля, 21:05
Это не столько ошибка, сколько блокиратор необдуманных действий. Он просто предупреждает, что данное исключение необходимо обработать вручную.
Ice14 уровень, Одесса
11 июля, 18:25
ParseException возникает, если вводиміе значения не соответствуют маске, например число вместо месяца. Или вместо названия месяца, какая-то барамбамбия.
Александр10 уровень, Минск
24 июня, 13:48
Не увидел смысла разбираться с этой задачкой, слишком много "но", единицы решили сами, остальные потырили коды со статей других ресурсов, но зато в комменты не полезли))) ps скопипастил и пошел дальше
Sasha Motorin16 уровень, Кострома
24 июня, 18:03
respect
Andrew10 уровень, Москва
23 июня, 13:46
Более продвинутые участники подскажите: я не стал брать готовое решение человека с новосиба. Одну строку кода нагуглил в одном месте, вторую, в другом, третью вообще подсмотрел в видео, а четвертую нашёл в оригинальной документации. Толком ничего про то, как работают даты не понял, но всё работает и валидатор принял. Это нормальная схема в программировании? Это нормальная схема в обучении вообще?
Alena35 уровень, Минск
1 июля, 12:04
норм нверняка в новосибе нет всех готовых решений, рано или поздно придётся что-то и самому написать )))
Nikita Maximov9 уровень, Москва
21 июня, 10:32
Может кому пригодится: решение взял из соединения кодов с данных сайтов https://qarchive.ru/12926_preobrazovanie_stroki_java_v_datu https://fooobar.com/questions/12103820/how-to-calculate-number-of-days-since-the-start-of-the-year