package com.javarush.task.task08.task0816;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
/*
Добрая Зинаида и летние каникулы
*/
public class Solution {
public static HashMap<String, Date> createMap() throws ParseException {
DateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
HashMap<String, Date> map = new HashMap<String, Date>();
map.put("Stallone", df.parse("JUNE 1 1980"));
//напишите тут ваш код
}
public static void removeAllSummerPeople(HashMap<String, Date> map) {
//напишите тут ваш код
}
public static void main(String[] args) {
}
}Andrey
1 уровень
Что означает df.parse? Откуда взялся, с чем едят?
Архивный
Комментарии (15)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Andrey
4 декабря 2018, 11:36
df это имя словаря, это понятно, но для чего этот словарь пасрить? И что это означает?
0
hidden #598481
4 декабря 2018, 12:08решение
df это имя переменной, которая содержит объект класса SimpleDataFormat:
Если в двух словах, то это класс, основное предназначение которого перегонять строку в дату и обратно по заданному формату.
Задаешь формат: "MMMMM d yyyy"
а потом говоришь распарсить дату из строки и даешь ему строку: df.parse("JUNE 1 1980")
Он смотрит в шаблон и понимает, что "JUNE" - это июнь, "1" - число месяца, а "1980" - год. И возвращает тебе объект класса Date, который равен указанной дате: Sun Jun 01 00:00:00 MSK 1980.
Обратная функция - это format(). Пишешь df.format(date), где date - это дата, и он форматирует ее по шаблону и выдает тебе обратно строку "June 1 1980"
+51
Andrey
4 декабря 2018, 12:23
То есть JANUARY, FEBRUARY, MARCH и т.д. являются шаблонными словами? Если допустить ошибку в написании месяца в верхнем регистре то выдаст ошибку?
-2
hidden #598481
4 декабря 2018, 12:37полезный
Грубо говоря, да.
При парсинге используются константы.
+7
Andrey
4 декабря 2018, 12:43
Ну, вроде как стало понятнее, хотя сейчас я уже ни в чём не уверен, спасибо)
0
Alex
14 мая 2019, 13:04
А подскажите пожалуйста, что значит "распарсить дату из строки и даешь ему строку: df.parse("JUNE 1 1980")" ? Не пойму вот это "parse".
+2
hidden #598481
14 мая 2019, 13:47
https://ru.wikipedia.org/wiki/Синтаксический_анализ
Ты создал штуку, которой можно сказать: "Шаблон даты выглядит так-то. Вот строка, в которой что-то написано. Прочитай, какая дата написана в этой строчке."
То есть ты сначала сказал, как получить из строки число, показав шаблон вида "MMMMM d yyyy", а потом сказал прочитать дату в соответствии с этим шаблоном из строки вида "JUNE 1 1980".
Внутри этого класса зашито, что "MMMMM" в шаблоне обозначает месяцы, "d" - дни месяца и т.д. Таким образом эта штука понимает, что "JUNE" это не просто четыре буквы "J", "U", "N", "E", а июнь.
В этом и заключается парсинг - анализ текста по установленным тобой правилам.
Противоположное действие - это форматирование. Это когда есть такой же шаблон и есть объект, в нашем случае объект даты, который нужно преобразовать обратно в текст по этому шаблону.
Из строки в объект - парсинг (англ. to parse - проводить разбор, анализ);
из объекта в строку - форматирование (англ. to format - форматировать).
Так называются и методы у SimpleDateFormat:
+56
Alex
14 мая 2019, 16:57
Огромное спасибо. Прям все по полочкам и на понятном языке! Побольше бы таки объяснений) Овер 100500 лайков! )
+3
hidden #598481
15 мая 2019, 07:26
Был рад помочь)
0
Андрей
6 февраля 2020, 12:03
Сейчас будет поток сознания, а вы пожалуйста скажите, я правильно мыслю. SimpleDataFormat это класс, которого есть параметры и есть методы. Например у класса человек есть параметры имя, рост, вес, дата рождения. А какие параметры у класса SimpleDateFormat? Просто строка в кавычках, внутри которой буквы и цифры с некоторыми ограничениями. И новый объект для этого класса это объект SimpleDataFormat, где буковки и циферки шаблона заменены на конкретные буковки и циферки и ничего больше , никакого физического смысла он не несет. А вот когда мы применяем к нему один из методов parse() то эти циферки и буковки превращаются в число long или int или Integer миллисекунд с 1 января 1970 года до этой даты, соответственно со знаком плюс или минус, поскольку мир сотворен был гораздо раньше.
0
Андрей
6 февраля 2020, 12:08
почему MMMMM, но JUNE? Вроде как число букв разное. И вообще формат "MMMMM d yyyy" стремный не только из-за числа букв М, но и из-за буквы d. Вроде в месяце 31 день.
0
hidden #598481
6 февраля 2020, 12:39полезный
Твой поток сознания - это ... действительно поток сознания))
Что ты называешь параметрами класса? Параметры могут быть у методов (и у конструкторов). При создании объекта мы обращаемся к конструктору и передаем ему параметры. Ты это имеешь в виду?
Да, у SimpleDateFormat есть конструктор, который принимает первым параметром строку. Этот конструктор разбивает эту строку на символы и смотрит, какие компоненты даты используются в этом шаблоне. Как именно это происходит - я рассказывать не возьмусь, если любопытно открой класс и почитай исходники.
IDEa → Ctrl+N → "SimpleDateFormat" → Enter → Смотришь конструкторы и последовательно изучаешь методы, которые вызываются при создании объекта.
В частности, буква M латинская - отвечает за месяцы. Месяцы имеют номера и текстовые названия, притом названия двух видов, сокращенные и полные. В документации по этому классу написано, что если использовать четыре и более одинаковых символов подряд, то будет выводиться полное название, если три символа - то сокращенное текстовое название, а один или два - номер. Отличие M от MM в том, что для января M - форматирует строку как "1", а MM - как "01", то есть дополнит до двух символов нулем.
У дней в месяце нет названий, только номера от 1 до 31. Поэтому сколько ты напишешь букв "d", столько символов и будет в названии: формат "dddddd" даст тебе число "000006" (6е число) или, например, "000025"(25е число). При этом одно "d" не будет отрезать значимые цифры от двузначных чисел. Единственное отличие "d" от "dd", как и "M" от "MM" - что второе дополняет нулями, а первое нет.
С количеством букв в названии месяца шаблон никак не связан, ведь шаблон один, а названия разные плюс они на разных языках. Шаблон формирует только принцип - брать полное название или сокращенное.
+9
Андрей
6 февраля 2020, 23:28
Спасибо. А рост вес и имя человек оказывается называются не параметрами , а переменными. Таким образом для класса SimpleDateFormat переменной будет некая строка шаблон. Я так понимаю в качестве переменной он принимает не любую строку , а только несколько видов. Что там делает этот класс со строкой, я не знаю, Но при наличии методов parse и format этот класс начинает приносить пользу. Без этих методов смысл этого класса я пока не понимаю.
Да , вопрос по формату, получается мы можем написать M d у и нам ничего не будет. Больше нули, а меньше ничего не меняется. Странно только что все корежат формат первых двух букв как хотят, а вот год никогда не трогают, всегда четыре штучки.
0
hidden #598481
7 февраля 2020, 06:33
Без этих методов смысл этого класса я пока не понимаю.
Так там почти все остальное - приватное, т.е. является внутренними шестеренками этого класса. Их призвание - обеспечить все необходимое, чтобы format и parse работали - превращали строки в даты и обратно. Класс потому и называется Simple~, что умеет делать всего несколько фич, зато удобных, простых и полезных.
Это все равно, что сказать, что не понимаешь смысла лопаты без методов раскапывать и закапывать - в них и есть смысл)
PS переменными в узком смысле обычно называют локальные переменные, созданные в методе. Если переменная создаётся в параметрах метода, ее и называют параметром метода, а если переменная создана непосредственно в классе, то ее называют полем этого класса. А в широком смысле все это является переменными, т.е. ячейками определенного типа, хранящими значения или ссылки на созданные объекты.
+4
Андрей
7 февраля 2020, 06:54
Спасибо, постараюсь запомнить это определение. Для этого мне потребуется Буратино с песней: поле поле поле чудес.....)))
+1