1. Dateклас и Unix време

От самото начало на Java езикът има специален клас за работа с часове и дати — Date. С течение на времето се появиха още няколко класа за работа с дати, но програмистите продължават да използват Dateкласа дори и днес.

Това е така, защото е много просто и удобно. И като програмист определено ще го срещнете във всеки реален проект. Дали да го използвате or не е ваш избор, но трябва да го знаете. Затова отделете няколко minutesи от ценното си време.

Какво прави Dateкласа толкова добър? Неговата простота.

Класът Dateсъхранява информация за дата и час като брой мorсекунди, които са изминали от 1 януари 1970 г. Това са много мorсекунди, така че longтипът се използва за тяхното съхраняване.

интересно

Защо точно от 1970 г.? Това е така нареченото Unix време : така операционната система Unix, която е дядото на всички съвременни операционни системи, поддържа времето.

Но можете много лесно да разберете колко време е минало между две дати: просто извадете едната дата от другата и ще получите времевата разлика между датите с точност до мorсекунда.

Ето някои полезни примери за работа с Dateкласа.


2. Получаване на текущата дата

За да получите текущия час и дата, просто създайте Dateобект. Всеки нов обект съхранява времето, когато е създаден. Изглежда много просто:

Date current = new Date();

След изпълнение на тази команда, currentпроменливата ще съхрани препратка към създадения Dateобект, който вътрешно ще съхрани времето на неговото създаване - броят мorсекунди, изминали от 1 януари 1970 г.

Показване на текущата дата на екрана

За да покажете текущата дата, просто: а) създайте нов Dateобект, б) отпечатайте го на екрана, като използвате System.out.println()метода.

Пример:

Код Конзолен изход
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Ето Howво означава изходът на конзолата:

Текст Интерпретация
четвъртък _ четвъртък
21 февруари 21 февруари
14:01:34 часа часове : minutesи : секунди
EET Часова зона: Източноевропейско време
2019 г година

3. Определяне на конкретна дата

Разбрахме How да получим текущия час, но How да създадем Dateобект, който съхранява различна дата or час?

Отново тук всичко е просто. За да зададете конкретна дата, трябва да напишете code по следния начин:

Date birthday = new Date(year, month, day);

Всичко е просто и очевидно, но има два нюанса, които трябва да знаете:

  1. Годината трябва да се брои от 1900 г.
  2. Месеците се номерират от нула.
интересно

Това е още едно наследство от операционната система Unix: в Unix програмистите обозначават годината с две цифри. Вместо 1977 г. те просто са написали 77. Така че 77 е правилната година, ако броим от 1900 г.

Например, аз съм роден на 21 март 1989 г. Март е третият месец, така че трябва да напиша:

Код Конзолен изход
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Месеците се номерират от нула, но дните не са. Това е малко странно, нали?

Смятаме, че истинските програмисти трябваше да надделеят и да номерират дните в месеца също от нула. Ох, тези конформисти 🙂

Задаване на конкретно време

Задаването на конкретно време също е доста просто: за това трябва да напишете изявление като това:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Часовете, minutesите и секундите се броят от нула: оставете програмиста във вас да въздъхне с облекчение.

Пример:

Код Конзолен изход
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Зададохме час 12:15 и дата 4 юни 2005 г. Това е малко трудно за четене от непрограмист, но работи Howто трябва.


4. Работа с елементи на дата

Можете да правите повече с даден Dateобект, отколкото просто да го показвате. Той има методи , които ви позволяват да получите отделни елементи от вътрешно съхранената дата:

Метод Описание
int getYear()
Връща годината на датата спрямо 1900 г.
int getMonth()
Връща месеца на датата (месеците са номерирани от нула)
int getDate()
Връща деня от месеца
int getDay()
Връща деня от седмицата
int getHours()
Връща часовете
int getMinutes()
Връща minutesите
int getSeconds()
Връща секундите

Пример:

Код Конзолен изход Забележка
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
Юнски
ден от месеца
събота

Между другото, Dateобект не само ви позволява да получите отделни елементи от дата, но и да ги промените:

Метод Описание
void setYear(int year) Променя годината на датата. Годината е посочена спрямо 1900г.
void setMonth(int month) Променя месеца на датата (месеците са номерирани от нула)
void setDate(int date) Променя деня от месеца
void setHours(int hours) Променя часовете
void setMinutes(int minutes) Променя minutesи
void setSeconds(int seconds) Промени секунди

5. Мorсекунди

Както казахме по-рано, Dateобектът съхранява броя мorсекунди, които са изминали от 1 януари 1970 г.

Ако имаме нужда от това число, можем да го получим от Dateобекта:

long time = date.getTime();

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

Не само можете да получите броя мorсекунди, но можете също да промените това число в съществуващ обект:

Date date = new Date();
date.setTime(1117876500000L);

Между другото, можете да напишете това още по-сбито, като предадете времето на Dateобекта точно когато е създаден:

Date date = new Date(1117876500000L);

6. Сравняване на дати

Ако искате да сравните две дати и да разберете коя е първата, имате три възможности

Първият начин е просто да сравните броя мorсекунди, които всеки съхранява:

if (date1.getTime() < date2.getTime())

Вторият начин е да използвате before()метода на Dateобект:

if (date1.before(date2))

Той се чете така: ако date1е преди date2, тогава...

Третият начин е да използвате after()метода на Dateобект:

if (date2.after(date1))

Той се чете така: ако date2е след date1, тогава...


7. DateFormatклас

Не забравяйте, че когато показахме датата на екрана, видяхме нещо подобно: Thu Feb 21 14:01:34 EET 2019. Всичко изглежда правилно, но форматът е по-скоро How една дата би била показана за програмисти, а не за нормални хора. Искаме да покажем датата по-ясно за потребителите. Нещо като Tuesday, February 21.

И без годината. Или с година, ако трябва. Като цяло искаме да можем да показваме датата по различни начини.

За това има специален клас: SimpleDateFormat.

Пример:

Код
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Конзолен изход
Jun-04-2005

Вижте Howво показва програмата: Jun-04-2005. Това изобщо не е това, което беше.

Разликата е, че показваме не Dateсамия обект, а специален низ, получен чрез извикване на format()метода на SimpleDateFormatобект. Но това дори не е основното тук.

Когато SimpleDateFormatобектът беше създаден, ние предадохме низа "MMM-dd-YYYY"като параметър. Именно този низ предава формата на датата, който в крайна сметка видяхме в изхода на конзолата.

  • MMM показва да се покаже името на месеца, съкратено с три букви
  • dd показва да се покаже деня от месеца
  • YYYY показва годината да се покаже с помощта на четири цифри

Ако искаме да изведем месеца като числа, тогава instead of MMM, трябва да напишем MM, което дава модела "MM-dd-YYYY". Изходът на екрана ще бъде06-04-2005

Ще обсъдим този клас по-подробно по-късно.


8. Date.parseметод

Класът Dateможе да направи нещо друго интересно и полезно - може да получи дата от низ. Или, Howто казват програмистите, може да анализира низ.

Има специален parse()метод за това. Разборът изглежда така:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Между другото, този code може да бъде написан по-компактно:

Date date = new Date("Jul 06 12:15:00 2019");

Ще разгледаме анализирането на низове по-подробно в други уроци.