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()
метода.
Пример:
Код | Конзолен изход |
---|---|
|
|
Ето Howво означава изходът на конзолата:
Текст | Интерпретация |
---|---|
четвъртък _ | четвъртък |
21 февруари | 21 февруари |
14:01:34 часа | часове : minutesи : секунди |
EET | Часова зона: Източноевропейско време |
2019 г | година |
3. Определяне на конкретна дата
Разбрахме How да получим текущия час, но How да създадем Date
обект, който съхранява различна дата or час?
Отново тук всичко е просто. За да зададете конкретна дата, трябва да напишете code по следния начин:
Date birthday = new Date(year, month, day);
Всичко е просто и очевидно, но има два нюанса, които трябва да знаете:
- Годината трябва да се брои от 1900 г.
- Месеците се номерират от нула.
Това е още едно наследство от операционната система Unix: в Unix програмистите обозначават годината с две цифри. Вместо 1977 г. те просто са написали 77. Така че 77 е правилната година, ако броим от 1900 г.
Например, аз съм роден на 21 март 1989 г. Март е третият месец, така че трябва да напиша:
Код | Конзолен изход |
---|---|
|
|
Месеците се номерират от нула, но дните не са. Това е малко странно, нали?
Смятаме, че истинските програмисти трябваше да надделеят и да номерират дните в месеца също от нула. Ох, тези конформисти 🙂
Задаване на конкретно време
Задаването на конкретно време също е доста просто: за това трябва да напишете изявление като това:
Date birthday = new Date(year, month, day, hour, minutes, seconds);
Часовете, minutesите и секундите се броят от нула: оставете програмиста във вас да въздъхне с облекчение.
Пример:
Код | Конзолен изход |
---|---|
|
|
Зададохме час 12:15 и дата 4 юни 2005 г. Това е малко трудно за четене от непрограмист, но работи Howто трябва.
4. Работа с елементи на дата
Можете да правите повече с даден Date
обект, отколкото просто да го показвате. Той има методи , които ви позволяват да получите отделни елементи от вътрешно съхранената дата:
Метод | Описание |
---|---|
|
Връща годината на датата спрямо 1900 г. |
|
Връща месеца на датата (месеците са номерирани от нула) |
|
Връща деня от месеца |
|
Връща деня от седмицата |
|
Връща часовете |
|
Връща minutesите |
|
Връща секундите |
Пример:
Код | Конзолен изход | Забележка |
---|---|---|
|
|
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
.
Пример:
Код |
---|
|
Конзолен изход |
|
Вижте 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");
Ще разгледаме анализирането на низове по-подробно в други уроци.
GO TO FULL VERSION