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