Знакомимся с классом Date

Открыта
Знакомимся с типом Date - 1

— Привет, Амиго. Хочу рассказать тебе про интересный класс – Date. С помощью этого класса можно хранить дату и время, а также измерять временные промежутки.

— Уже интересно. Продолжай.

— Каждый объект типа Date хранит внутри себя время. А время хранится в очень интересном виде – количество миллисекунд, которые прошли с 1 января 1970 года, по Гринвичу.

— Ничего себе!

— Ага. Это число настолько большое, что не влезает в int, приходится хранить его в long. Зато очень удобно считать разницу между двумя датами: отнял два числа и уже известна разница с точностью до миллисекунд. И к тому же устраняется проблема смены дат и перевода часов.

— А что самое интересное, каждый объект при создании инициализируется текущим временем. Чтобы узнать текущее время – достаточно просто создать объект.

— А как с ним работать?

— Вот тебе несколько примеров:

Получение текущей даты:
public static void main(String[] args) throws Exception
{
    Date today = new Date();
    System.out.println("Current date: " + today);
}
Вычисление разницы между двумя датами:
public static void main(String[] args) throws Exception
{
    Date currentTime = new Date();           //получаем текущую дату и время
    Thread.sleep(3000);                      //ждём 3 секунды – 3000 миллисекунд
    Date newTime = new Date();               //получаем новое текущее время

    long msDelay = newTime.getTime() - currentTime.getTime(); //вычисляем разницу
    System.out.println("Time distance is: " + msDelay + " in ms");
}
Наступило ли уже некоторое время:
public static void main(String[] args) throws Exception
{
    Date startTime = new Date();

    long endTime = startTime.getTime() + 5000;   //    +5 секунд
    Date endDate = new Date(endTime);

    Thread.sleep(3000);              // ждем 3 секунды

    Date currentTime = new Date();
    if(currentTime.after(endDate))//проверяем что время currentTime после endDate
    {
        System.out.println("End time!");
    }
}
Сколько прошло времени с начала сегодняшнего дня:
public static void main(String[] args) throws Exception
{
    Date currentTime = new Date();
    int hours = currentTime.getHours();
    int mins = currentTime.getMinutes();
    int secs = currentTime.getSeconds();

    System.out.println("Time from midnight " + hours + ":" + mins + ":" + secs);
}
Сколько дней прошло с начала года:
public static void main(String[] args) throws Exception
{
    Date yearStartTime = new Date();
    yearStartTime.setHours(0);
    yearStartTime.setMinutes(0);
    yearStartTime.setSeconds(0);

    yearStartTime.setDate(1);      // первое число
    yearStartTime.setMonth(0);     // месяц январь, нумерация для месяцев 0-11

    Date currentTime = new Date();
    long msTimeDistance = currentTime.getTime() - yearStartTime.getTime();
    long msDay = 24 * 60 * 60 * 1000;  //сколько миллисекунд в одних сутках

    int dayCount = (int) (msTimeDistance/msDay); //количество целых дней
    System.out.println("Days from start of year: " + dayCount);
}
10
Задача
Java Syntax,  8 уровень,  4 лекция
Недоступна
Набираем код
Внимание! Объявляется набор кода на JavaRush. Для этого включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие, как может показаться на первый взгляд: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).

— Метод getTime() возвращает количество миллисекунд, которое хранится в объекте Date.

— Метод after() проверяет, что дата, у которой мы вызвали метод, идет после переданной в метод даты after.

— Методы getHours(), getMinutes(), getSeconds() возвращают количество часов, минут и секунд у объекта, у которого их вызвали.

— Более того, в последнем примере ты видишь, что можно повлиять на дату/время, сохраненное в объекте Date. Мы получаем текущее время и дату, а затем сбрасываем часы, минуты и секунды в 0. Так же устанавливаем месяц в Январь, а день месяца в 1. Теперь объект yearStartTime хранит дату и время 1 января текущего года 0 часов 0 минут 0 секунд.

— Потом мы снова получаем текущую дату currentTime, и вычисляем разницу в миллисекундах между двумя датами. Я про msTimeDistance.

— Затем делим msTimeDistance на количество миллисекунд в сутках и получаем полное количество дней, прошедшее с начала года до сегодняшнего дня!

— Вау! Вот это круто!

Комментарии (126)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Eugene10 уровень
7 апреля, 19:19
Я один сейчас ничего не понимаю, но задачи хоть как-то решаю? )
Franksol8 уровень, Новосибирск
8 апреля, 07:53
Не один)
28 марта, 05:57
Устаревший класс, не рекомендован к использованию
АртемGeek13 уровень, Москва
6 апреля, 06:48
Да вы все правильно написали. Но надо иметь в виду, что на работе в большинстве случаев вы будете работать именно со старым кодом и как правило стажеры именно с ним и работают.
11 апреля, 13:50
нет, этот класс в использовании никто нигде не увидит, он помечен как depricated с первой версии java
Алексей9 уровень
16 марта, 04:26
пардон, в примере №3 "наступило ли некоторое время" 5000 и 3000 не перепутаны местами? А то мой внутричерепной компилятор зависает)))
Евгений Майдуров10 уровень, Новосибирск
17 марта, 20:17
Но, странный пример, могли бы положительные условия для блока if создать, либо else дописать)
Alexey Yagudin15 уровень, Санкт-Петербург
11 февраля, 10:35
злое легаси!
Антон13 уровень, Москва
5 февраля, 10:57
16-я строка:
int dayCount =  (int)  (msTimeDistance/msDay); //количество целых дней
это приведение исходного long к типу int?
qwaPPP16 уровень, Москва
20 февраля, 12:34
Оно самое, явное приведение типов
Evgeny Pashko13 уровень, Минск
4 февраля, 20:03
Все лентяи как и я в набираем код делают ctrl+c - ctrl+v ???
Aleksandr Petrov15 уровень
5 февраля, 13:58
Хорошо научился слепому методу набора)) вроде так не особо напрягает))
qwaPPP16 уровень, Москва
20 февраля, 12:35
Если ты работаешь в сфере IT, то скорее всего ты лентяй, так что это норм))) к тому же меньше ошибок)))
Евгений Майдуров10 уровень, Новосибирск
17 марта, 20:19
Я набираю)
Андрей8 уровень
26 марта, 19:45
Вообще тут палка с двух концов. С одной стороны правильнее даже копировать 100% рабочий код и вставлять его, т.к. меньше вероятности какой-нибудь синтаксической ошибки будет, но с другой стороны - суть этого упражнения здесь, чтобы набирая код ты подсазнательно запомнил методы класса, например, либо просто научился слепому набору текста даже на англ. языке. Когда 10 раз одно и тоже пишешь сам, то подсазнательно откладывается в голове и потом легче будет.
Franksol8 уровень, Новосибирск
8 апреля, 07:54
а у меня почему-то не работают ctrl+c - ctrl+v ( приходится набирать
Bamb9 уровень, Москва
21 января, 09:06
Лекция устарела и в Idea нормально не работает.
Антон Попов9 уровень, Санкт-Петербург
19 января, 20:26
Пожалуйста перепишите лекцию на java.time.Instant
Андрей18 уровень, Новосибирск
29 декабря 2018, 19:08
Почему дни месяца не с нуля нумеруются?)
Антон13 уровень, Москва
5 февраля, 10:56
Наверное, чтобы совсем не запутаться.
Peter Jackson9 уровень, Москва
среда, 13:29
Это неспроста. Несколькими уровнями/лекциями была задачка, где нужно было вывести дату. Благодаря этой задаче я понял, что месяцы в джаве считаются с нулевого)) Не претендую на правду. Поправьте, если неправ.
Mikhail Uchakov24 уровень, Санкт-Петербург
25 декабря 2018, 05:34
Перепишите под Calendar. В старой версии сайта было и все ругались, на новый перенесли, и опять все ругаются.
Александр20 уровень, Казань
17 января, 12:46
Calendar дальше будет?
Mikhail Uchakov24 уровень, Санкт-Петербург
22 января, 07:12
Как оказалось, его вынесли в отдельную тему и ему посвящена целая статья/лекция.