Среднее время по Гринвичу
Всемирное время
Всемирное координированное время
Секунда координации
База данных tz database
Часовые зоны
Сезонный перевод времени
Переход на летнее время
Федеральный закон об исчислении времени
Получение и измерение времени
Получение времени
Измерение времени
Абсолютность времени
Класс java.util.Date
Получение объекта класса Date
Где хранится информация о часовых зонах?
Обновление информации о часовых зонах
Часовые зоны
Доступные часовые зоны
Получение информации о часовой зоне
Переход на летнее время
Переход на зимнее время
Класс java.util.Calendar
Класс java.util.Calendar
Класс java.util.GregorianCalendar
Получение даты и времени
Получение даты и времени
Задание даты и времени
Увеличение даты и времени
“Прокручивание” даты и времени
Задание даты и времени
Задание даты и времени
Задание даты и времени
Задание даты и времени
Класс java.util.Calendar
Нестрогая проверка изменения полей
Строгая проверка изменения полей
Часовые зоны
Использование часовых зон
Класс java.text.DateFormat
Форматирование даты и времени
Форматирование даты и времени
Форматирование даты и времени с заданием часовой зоны
Разбор даты и времени
Разбор даты и времени с заданием часовой зоны
Нестрогая валидация
Строгая валидация
1.84M
Category: programmingprogramming

Типы для времени и денег. Дата и время

1.

IX. Типы для времени и денег
1. Дата и время
1

2. Среднее время по Гринвичу

Среднее время по Гринвичу (англ. Greenwich Mean Time, GMT) —
астрономическое
(среднее
солнечное)
время
меридиана,
проходящего через прежнее место расположения Гринвичской
обсерватории (нулевого меридиана). До 1972 года, GMT считалось
точкой
отсчёта
времени — время в
других часовых
поясах отсчитывалось от гринвичского. Сейчас в качестве точки
отсчёта времени используется всемирное координированное время
UTC.
2

3. Всемирное время

Всемирное время или UT (англ. Universal Time) — шкала времени,
основанная на вращении Земли. Всемирное время является
современной заменой среднего времени по Гринвичу (GMT).
Всемирное время введено 1 января 1925 года. Фактически термин
«всемирное время» является многозначным, так как существует
несколько версий всемирного времени: UT0, UT1, UT2, … , главной из
которых является UT1. Все версии всемирного времени основаны на
вращении Земли относительно далеких небесных объектов
(звёзд и квазаров), используя коэффициент масштабирования и
другие подстройки для того, чтобы быть точнее.
3

4. Всемирное координированное время

Всемирное координированное время (англ. Universal Coordinated
Time,
UTC) —
равномерная
шкала
времени
заменившая
неравномерную UT1. Шкала UTC основана на равномерной шкале
атомного времени (TAI) и является более удобной для использования.
Отличается на целое количество секунд от атомного времени и на
дробное количество секунд от всемирного времени UT1.
Среднее время по Гринвичу GMT иногда некорректно используется в
качестве синонима для всемирного координированного времени UTC.
4

5. Секунда координации

Для поддержания расхождения UTC и UT1 не более чем 0,9 с при
необходимости 30 июня или 31 декабря может добавляться (или в
теории вычитатьтся) дополнительная секунда координации. До сих
пор все секунды координации добавлялись. Таким образом шкала
времени UTC в отличие от других версий всемирного времени
является равномерной, но не является непрерывной.
5

6.

База данных tz и часовые зоны
6

7. База данных tz database

База данных tz database
База данных tz database, также известная как tzdata, база данных
zoneinfo или IANA Time Zone Database, - собрание информации о
часовых зонах в мире в основном предназначенная для
использования программами и операционными системами. Наиболее
известна по универсальным соглашениям о наименовании часовых
зон таких как America/New_York and Europe/Paris. База данных
пытается записать все изменения такие как переход на летнее время
и секунды координации.
7

8. Часовые зоны

Часовая зона в базе данных tz database это часть територии
государства в которой использовалось одинаковое время после 1970
года. Это определение учитывает что в географической области
одинаковое местное время и отличается от других определений для
которых важно одинаковое смещение от времени на главном
меридиане. По этой причине каждая часовая зона определённая в
базе данных tz может иметь несколько смещений от UTC обычно
включая стандартное время и летнее время.
Часовые
зоны
имеют
уникальные
имена
в
форме
«Район/Расположение» (Area/Location). Выбираются англоязычные
названия или их эквиваленты, опускается пунктуация и общие
суффиксы, пробел заменяется на подчёркивание, используются
дефисы. Районы включают имена континентов, океанов и «прочее»
(Etc). В набор континентов и океанов входят: Африка, Америка,
Антарктика, Северный Ледовитый океан, Азия, Атлантический
океан, Австралия, Европа, Индийский океан и Тихий океан.
8

9.

Сезонный перевод времени
9

10. Сезонный перевод времени

Сезонный перевод времени (переход на летнее время daylight saving
time (DST) или summer time) - перевод часов вперёд на время летних
месяцев. Обычно часы переводятся вперёд на один час в начале
весны и обратно осенью. Сезонный перевод времени позволяет в
летние месяцы начинать рабочий день раньше и более продуктивно
использовать солнечный день. Не все страны поддерживают
cезонный перевод времени. Правила когда и насколько переводить
часы и переводить ли их вообще могут отличаться в разных странах и
даже в одной стране в разные годы.
10

11. Переход на летнее время

11

12.

Время у нас
12

13. Федеральный закон об исчислении времени

Федеральный закон Российской Федерации от 3 июня 2011 г. N 107ФЗ "Об исчислении времени" отменил переходы на летнее и зимнее
время оставив в Российской Федерации летнее время. В Москве
использовался часовой пояс UTC +4.
Федеральный закон Российской Федерации от 21 июля 2014 г. N 248ФЗ "О внесении изменений в Федеральный закон "Об исчислении
времени" вступает в силу 26 октября 2014 года в 2 часа 00 минут.
Фактически переводит часы на зимнее время или на 1 час назад. В
Москве будет использовался часовой пояс UTC +3.
13

14.

Получение и измерение времени
14

15. Получение и измерение времени

package
package java.lang;
java.lang;
public
public final
final class
class System
System {{
}}
public
public static
static long
long currentTimeMillis()
currentTimeMillis()
public
public static
static long
long nanoTime()
nanoTime()
C
В классе System определены статические методы currentTimeMillis и nanoTime. С
помощью метода currentTimeMillis можно получить текущее абсолютное время в
миллисекундах с начала эпохи - 0:00:00 1 января 1970 UTC. Время получается с
помощью системных часов. С помощью метода nanoTime можно получить
относительное время в наносекундах начиная с некоторого момента времени.
Разрешение методов currentTimeMillis и nanoTime зависит от операционной системы и
как правило не совпадает с точностью. Часто разрешение метода currentTimeMillis
составляет 16 миллисекунд, а не 1.
15

16. Получение времени

public
public class
class TimeObtainDemo
TimeObtainDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
DateFormat
DateFormat formatter
formatter == new
new SimpleDateFormat("yyyy.MM.dd
SimpleDateFormat("yyyy.MM.dd HH:mm:ss
HH:mm:ss z");
z");
long
current
=
System.currentTimeMillis();
long current = System.currentTimeMillis();
}}
}}
System.out.println("Current
System.out.println("Current time
time in
in milliseconds
milliseconds since
since 01.01.1970:
01.01.1970: "" ++ current);
current);
System.out.println(formatter.format(current));
System.out.println(formatter.format(current));
Current
Current time
time in
in milliseconds
milliseconds since
since 01.01.1970:
01.01.1970: 1326621450000
1326621450000
2012.01.15
2012.01.15 16:57:30
16:57:30 NOVT
NOVT
16

17. Измерение времени

public
public class
class TimeMeasureDemo
TimeMeasureDemo {{
private
private static
static void
void doSomething()
doSomething() throws
throws InterruptedException
InterruptedException {{
for
for (int
(int ii == 0;
0; ii << 5;
5; i++)
i++) {{
}}
}}
System.out.println("Doing
System.out.println("Doing something...");
something...");
Thread.sleep(1000);
Thread.sleep(1000);
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws InterruptedException
InterruptedException {{
long
long startTime
startTime == System.currentTimeMillis();
System.currentTimeMillis();
doSomething();
doSomething();
long
long endTime
endTime == System.currentTimeMillis();
System.currentTimeMillis();
}}
}}
long
long totalTime
totalTime == endTime
endTime -- startTime;
startTime;
System.out.println("It
System.out.println("It took
took "" ++ (totalTime
(totalTime // 1000)
1000)
++ "" seconds
seconds to
to do
do something");
something");
Doing
Doing something...
something...
Doing
Doing something...
something...
Doing
Doing something...
something...
Doing
Doing something...
something...
Doing
Doing something...
something...
It
took
It took 55 seconds
seconds to
to do
do something
something
17

18. Абсолютность времени

public
public class
class AbsoluteDemo
AbsoluteDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
DateFormat
DateFormat formatter
formatter == new
new SimpleDateFormat("yyyy.MM.dd
SimpleDateFormat("yyyy.MM.dd HH:mm:ss
HH:mm:ss zz Z");
Z");
long
long zero
zero == 0;
0;
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(formatter.format(zero));
System.out.println(formatter.format(zero));
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(formatter.format(zero));
System.out.println(formatter.format(zero));
}}
}}
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Novosibirsk"));
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Novosibirsk"));
System.out.println(formatter.format(zero));
System.out.println(formatter.format(zero));
1969.12.31
1969.12.31 16:00:00
16:00:00 PST
PST -0800
-0800
1970.01.01
1970.01.01 00:00:00
00:00:00 GMT
GMT +0000
+0000
1970.01.01
1970.01.01 07:00:00
07:00:00 NOVT
NOVT +0700
+0700
18

19.

Класс java.util.Date
19

20. Класс java.util.Date

package
package java.util;
java.util;
public
public class
class Date
Date implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Date>
Comparable<Date> {{
private
fastTime;
fastTime
private transient
transient long
long fastTime
fastTime;
public
public Date()
Date() {{
System.currentTimeMillis()
System.currentTimeMillis() );
this(System.currentTimeMillis()
this(System.currentTimeMillis()
);
}}
public
public Date(long
Date(long date)
date) {{
fastTime
fastTime
fastTime == date;
date;
}}
}}
public
public
public
public
public
public
long
long getTime()
getTime()
boolean
boolean after(Date
after(Date when)
when)
boolean
boolean before(Date
before(Date when)
when)
public
public
public
public
public
public
public
public
Object
Object clone()
clone()
int
int compareTo(Date
compareTo(Date anotherDate)
anotherDate)
boolean
boolean equals(Object
equals(Object obj)
obj)
String
String toString()
toString()
C
Класс Date представляет момент времени с точностью до миллисекунды. Поле fastTime
предназначено для хранения числа миллисекунд с начала эпохи - 0:00:00 1 января 1970
UTC. До JDK 1.1 этот класс имел две дополнительные функции. Первая - интерпретация
fastTime как года, месяца, дня, часа, минуты и секунды. Вторая - форматирование даты
и времени и преобразование строк в объекты класса Date. Сейчас все эти методы
являются не рекомендуемыми к использованию. Класс Date не поддерживает
использование часовых зон и все преобразования происходят используя локальную
часовую зону. Всего в классе Date 23 метода которые не рекомендуются к
использованию.
20

21. Получение объекта класса Date

public
public class
class DateObtainDemo
DateObtainDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
DateFormat
DateFormat formatter
formatter == new
new SimpleDateFormat("yyyy.MM.dd
SimpleDateFormat("yyyy.MM.dd HH:mm:ss
HH:mm:ss z");
z");
Date
current
=
new
Date();
Date current = new Date();
}}
}}
System.out.println("Current
System.out.println("Current time
time in
in milliseconds
milliseconds since
since 01.01.1970:
01.01.1970: "" ++ current.getTime());
current.getTime());
System.out.println(formatter.format(current));
System.out.println(formatter.format(current));
Current
Current time
time in
in milliseconds
milliseconds since
since 01.01.1970:
01.01.1970: 1326621450000
1326621450000
2012.01.15
16:57:30
NOVT
2012.01.15 16:57:30 NOVT
21

22.

Часовые зоны
22

23. Где хранится информация о часовых зонах?

Информация о часовых зонах в JDK или JRE хранится в каталоге
<install_dir>/jre/lib/zi. Каждому району соответствует папка в которой
хранятся файлы для различных расположений. На платформе
Windows, JRE использует файл <java-home>\lib\tzmappings для
представления отображений между часовыми зонами Windows и
Java.
23

24. Обновление информации о часовых зонах

Утилита
TZUpdater
позволяет
обновлять
установленные
комплект
разработчика Java Development Kit (JDK) и среду выполнения Java Runtime
Environment (JRE) более поздними данными о часовых зонах.
Компания Oracle использует общедоступные данные из базы данных IANA Time
Zone Database. Появление обновления утилиты как правило происходит через
несколько недель после того как IANA выпускает обновление базы данных
часовых зон. Обновления могут выпускаться раньше в случае крайней
необходимости. Утилита TZUpdater может быть загружена с сайта
http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html
Описание обновлений базы данных tz database и соответствующие версии
утилиты TZUpdater и версии обновлений JDK и JRE можно найти на сайте
http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html
Компания Oracle настоятельно рекомендует использовать последние выпуски
релизов обновлений JDK или JRE для обновления данных часовых зон и
других улучшений и исправлений продуктов. При этом TZUpdater для
обновлений базы данных tz database появляется раньше чем выпуски
обновлений JDK или JRE.
24

25. Часовые зоны

25

26. Доступные часовые зоны

public
public class
class TimeZoneAvailableDemo
TimeZoneAvailableDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
String[]
String[] IDs
IDs == TimeZone.getAvailableIDs();
TimeZone.getAvailableIDs();
}}
}}
for
for (String
(String id
id :: IDs)
IDs) {{
System.out.println(id);
System.out.println(id);
}}
Etc/GMT+12
Etc/GMT+12
Etc/GMT+11
Etc/GMT+11
Pacific/Midway
Pacific/Midway
Pacific/Niue
Pacific/Niue
Pacific/Pago_Pago
Pacific/Pago_Pago
Pacific/Samoa
Pacific/Samoa
US/Samoa
US/Samoa
America/Adak
America/Adak
America/Atka
America/Atka
Etc/GMT+10
Etc/GMT+10
HST
HST
Pacific/Honolulu
Pacific/Honolulu
...
...
Pacific/Apia
Pacific/Apia
Pacific/Enderbury
Pacific/Enderbury
Pacific/Fakaofo
Pacific/Fakaofo
Pacific/Tongatapu
Pacific/Tongatapu
Etc/GMT-14
Etc/GMT-14
Pacific/Kiritimati
Pacific/Kiritimati
26

27. Получение информации о часовой зоне

public
public class
class TimeZoneDemo
TimeZoneDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws ParseException
ParseException {{
TimeZone
TimeZone timeZone
timeZone == TimeZone.getTimeZone("Europe/Moscow");
TimeZone.getTimeZone("Europe/Moscow");
System.out.println(timeZone);
System.out.println(timeZone);
}}
}}
System.out.println(timeZone.getDisplayName());
System.out.println(timeZone.getDisplayName());
System.out.println(timeZone.getID());
System.out.println(timeZone.getID());
System.out.println("Current
System.out.println("Current offset:
offset: "" ++ timeZone.getOffset(System.currentTimeMillis())/60/60/1000);
timeZone.getOffset(System.currentTimeMillis())/60/60/1000);
System.out.println("Offset
System.out.println("Offset on
on January
January 1st
1st 1970:
1970: "" ++ timeZone.getOffset(0)/60/60/1000);
timeZone.getOffset(0)/60/60/1000);
sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=14400000,dstSavings=0,useDaylight=false,transitions=78,l
sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=14400000,dstSavings=0,useDaylight=false,transitions=78,l
astRule=null]
astRule=null]
Moscow
Moscow Standard
Standard Time
Time
Europe/Moscow
Europe/Moscow
Current
Current offset:
offset: 44
Offset
Offset on
on January
January 1st
1st 1970:
1970: 33
27

28. Переход на летнее время

public
public class
class DaylightSavingsDemo
DaylightSavingsDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
SimpleDateFormat
SimpleDateFormat simpleFormat
simpleFormat == new
new SimpleDateFormat("EEEE,
SimpleDateFormat("EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss
HH:mm:ss zzzz");
zzzz");
TimeZone
TimeZone zone
zone == TimeZone.getTimeZone("Europe/Moscow");
TimeZone.getTimeZone("Europe/Moscow");
simpleFormat.setTimeZone(zone);
simpleFormat.setTimeZone(zone);
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.setTimeZone(zone);
calendar.setTimeZone(zone);
calendar.set(2010,
calendar.set(2010, 2,
2, 28,
28, 2,
2, 0,
0, 0);
0);
calendar.set(Calendar.MILLISECOND,0);
calendar.set(Calendar.MILLISECOND,0);
System.out.println(calendar.getTime().getTime());
System.out.println(calendar.getTime().getTime());
System.out.println(simpleFormat.format(calendar.getTime()));
System.out.println(simpleFormat.format(calendar.getTime()));
calendar.set(2010,
calendar.set(2010, 2,
2, 28,
28, 3,
3, 0,
0, 0);
0);
calendar.set(Calendar.MILLISECOND,0);
calendar.set(Calendar.MILLISECOND,0);
}}
}}
System.out.println(calendar.getTime().getTime());
System.out.println(calendar.getTime().getTime());
1269730800000
1269730800000
Sunday,
Sunday, 28
28 March
March 2010
2010 03:00:00
03:00:00 Moscow
Moscow Daylight
Daylight Time
Time
1269730800000
1269730800000
28

29. Переход на зимнее время

public
public class
class DaylightSavingsFallDemo
DaylightSavingsFallDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
SimpleDateFormat
SimpleDateFormat simpleFormat
simpleFormat == new
new SimpleDateFormat(
SimpleDateFormat(
"EEEE,
"EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss
HH:mm:ss zzzz");
zzzz");
TimeZone
TimeZone zone
zone == TimeZone.getTimeZone("Europe/Moscow");
TimeZone.getTimeZone("Europe/Moscow");
simpleFormat.setTimeZone(zone);
simpleFormat.setTimeZone(zone);
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.setTimeZone(zone);
calendar.setTimeZone(zone);
calendar.set(2010,
calendar.set(2010, 9,
9, 31,
31, 1,
1, 0,
0, 0);
0);
calendar.set(Calendar.MILLISECOND,
calendar.set(Calendar.MILLISECOND, 0);
0);
long
long time
time == calendar.getTime().getTime();
calendar.getTime().getTime();
}}
}}
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
for
for (int
(int ii == 0;
0; ii << 10;
10; i++)
i++) {{
System.out.println(simpleFormat.format(time
System.out.println(simpleFormat.format(time ++ i*20*60*1000)
i*20*60*1000) ++ "" "" ++ (time
(time ++ i*20*60*1000));
i*20*60*1000));
}}
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
October
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
2010
01:00:00
01:00:00
01:20:00
01:20:00
01:40:00
01:40:00
02:00:00
02:00:00
02:20:00
02:20:00
02:40:00
02:40:00
02:00:00
02:00:00
02:20:00
02:20:00
02:40:00
02:40:00
03:00:00
03:00:00
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Moscow
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Daylight
Standard
Standard
Standard
Standard
Standard
Standard
Standard
Standard
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
Time
1288472400000
1288472400000
1288473600000
1288473600000
1288474800000
1288474800000
1288476000000
1288476000000
1288477200000
1288477200000
1288478400000
1288478400000
1288479600000
1288479600000
1288480800000
1288480800000
1288482000000
1288482000000
1288483200000
1288483200000
29

30.

Календари
30

31.

31

32. Класс java.util.Calendar

package
package java.util;
java.util;
public
public abstract
abstract class
class Calendar
Calendar implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Calendar>
Comparable<Calendar> {{
protected
time;
time
protected long
long time
time;
public
public final
final Date
Date getTime()
getTime() {{
return
return new
new Date(getTimeInMillis());
Date(getTimeInMillis());
}}
public
public final
final void
void setTime(Date
setTime(Date date){
date){
setTimeInMillis(date.getTime());
setTimeInMillis(date.getTime());
}}
}}
public
public long
long getTimeInMillis()
getTimeInMillis()
public
public void
void setTimeInMillis(long
setTimeInMillis(long millis)
millis)
C
A
Абстрактный класс Calendar содержит поле для хранения абсолютного момента
времени в миллисекундах после начала эпохи и поля для хранения набора полей
календаря таких как год, месяц, день, час, ... В классе объявлены методы для
преобразования между абсолютным моментом времени и набором полей календаря.
32

33. Класс java.util.Calendar

package
package java.util;
java.util;
public
public abstract
abstract class
class Calendar
Calendar implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Calendar>
Comparable<Calendar> {{
protected
protected int
int fields[];
fields[];
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
ERA
ERA == 0;
0;
YEAR
YEAR == 1;
1;
MONTH
MONTH == 2;
2;
WEEK_OF_YEAR
WEEK_OF_YEAR == 3;
3;
WEEK_OF_MONTH
=
WEEK_OF_MONTH = 4;
4;
DATE
DATE == 5;
5;
DAY_OF_MONTH
DAY_OF_MONTH == 5;
5;
DAY_OF_YEAR
DAY_OF_YEAR == 6;
6;
DAY_OF_WEEK
DAY_OF_WEEK == 7;
7;
DAY_OF_WEEK_IN_MONTH
DAY_OF_WEEK_IN_MONTH == 8;
8;
AM_PM
AM_PM == 9;
9;
HOUR
HOUR == 10;
10;
HOUR_OF_DAY
HOUR_OF_DAY == 11;
11;
MINUTE
MINUTE == 12;
12;
SECOND
=
13;
SECOND = 13;
MILLISECOND
MILLISECOND == 14;
14;
ZONE_OFFSET
ZONE_OFFSET == 15;
15;
public
public
public
public
void
void set(int
set(int field,
field, int
int value)
value)
int
get(int
field)
int get(int field)
abstract
abstract public
public void
void add(int
add(int field,
field, int
int amount)
amount)
}}
abstract
abstract public
public void
void roll(int
roll(int field,
field, int
int amount)
amount)
При задании и получении месяца с использованием
календаря, месяцы нумеруются от 0 до 11. Дни
недели нумеруются от 1 до 7, причём 1
соответствует воскресенью.
33

34. Класс java.util.GregorianCalendar

package
package java.util;
java.util;
public
public class
class GregorianCalendar
GregorianCalendar extends
extends Calendar
Calendar {{
public
public GregorianCalendar()
GregorianCalendar() {{
this(TimeZone.getDefault(),
this(TimeZone.getDefault(), Locale.getDefault());
Locale.getDefault());
}}
public
public GregorianCalendar(TimeZone
GregorianCalendar(TimeZone zone)
zone) {{
this(zone,
this(zone, Locale.getDefault());
Locale.getDefault());
}}
public
public GregorianCalendar(Locale
GregorianCalendar(Locale locale)
locale) {{
this(TimeZone.getDefault(),
this(TimeZone.getDefault(), locale);
locale);
}}
public
public GregorianCalendar(TimeZone
GregorianCalendar(TimeZone zone,
zone, Locale
Locale locale)
locale) {{
this(zone,
this(zone, locale,
locale, false);
false);
setTimeInMillis(System.currentTimeMillis());
setTimeInMillis(System.currentTimeMillis());
}}
}}
public
public GregorianCalendar(int
GregorianCalendar(int year,
year, int
int month,
month, int
int day,
day, int
int hour,
hour, int
int minute,
minute, int
int second){
second){
this(TimeZone.getDefault(),
this(TimeZone.getDefault(), Locale.getDefault(),
Locale.getDefault(), false);
false);
set(year,
set(year, month,
month, day,
day, hour,
hour, minute,
minute, second);
second);
}}
...
...
C
Класс GregorianCalenar – представляет Григорианский календарь. Конструктор по
умолчанию создаёт календарь с текущим временем и с часовой зоной по умолчанию.
Рекомендуется использовать конструктор задающий часовую зону.
34

35. Получение даты и времени

public
public class
class CalendarGetDemo
CalendarGetDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
int
int
int
int
int
int
int
int
int
int
int
int
year
year == calendar.get(Calendar.YEAR);
calendar.get(Calendar.YEAR);
month
month == calendar.get(Calendar.MONTH);
calendar.get(Calendar.MONTH);
dayOfMonth
dayOfMonth == calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.DAY_OF_MONTH); //
// Jan
Jan == 0,
0, not
not 11
dayOfWeek
dayOfWeek == calendar.get(Calendar.DAY_OF_WEEK);
calendar.get(Calendar.DAY_OF_WEEK);
weekOfYear
=
weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
calendar.get(Calendar.WEEK_OF_YEAR);
weekOfMonth
weekOfMonth == calendar.get(Calendar.WEEK_OF_MONTH);
calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println("year:
System.out.println("year: "" ++ year
year ++ ",
", month:
month: "" ++ month
month
++ ",
", dayOfMonth:
dayOfMonth: "" ++ dayOfMonth
dayOfMonth ++ ",
", dayOfWeek:
dayOfWeek: "" ++ dayOfWeek
dayOfWeek
++ ",
weekOfMonth:
"
+
weekOfMonth);
", weekOfMonth: " + weekOfMonth);
int
int
int
int
int
int
int
int
int
int
}}
}}
hour
hour == calendar.get(Calendar.HOUR);
calendar.get(Calendar.HOUR); //
// 12
12 hour
hour clock
clock
hourOfDay
hourOfDay == calendar.get(Calendar.HOUR_OF_DAY);
calendar.get(Calendar.HOUR_OF_DAY); //
// 24
24 hour
hour clock
clock
minute
minute == calendar.get(Calendar.MINUTE);
calendar.get(Calendar.MINUTE);
second
=
calendar.get(Calendar.SECOND);
second = calendar.get(Calendar.SECOND);
millisecond
millisecond == calendar.get(Calendar.MILLISECOND);
calendar.get(Calendar.MILLISECOND);
System.out.println("hour:
System.out.println("hour: "" ++ hour
hour ++ ",
", hourOfDay:
hourOfDay: "" ++ hourOfDay
hourOfDay
++ ",
", minute:
minute: "" ++ minute
minute ++ ",
", second:
second: "" ++ second
second
++ ",
millisecond:
"
+
millisecond);
", millisecond: " + millisecond);
35

36. Получение даты и времени

year:
year: 2013,
2013, month:
month: 0,
0, dayOfMonth:
dayOfMonth: 11,
11, dayOfWeek:
dayOfWeek: 6,
6, weekOfMonth:
weekOfMonth: 22
hour:
hour: 9,
9, hourOfDay:
hourOfDay: 21,
21, minute:
minute: 21,
21, second:
second: 19,
19, millisecond:
millisecond: 609
609
36

37. Задание даты и времени

public
public class
class CalendarSetDemo
CalendarSetDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
SimpleDateFormat
SimpleDateFormat simpleFormat
simpleFormat == new
new SimpleDateFormat("yyyy-MM-dd
SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
HH:mm:ss.SSS");
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.set(Calendar.YEAR,
calendar.set(Calendar.YEAR, 1984);
1984);
calendar.set(Calendar.MONTH,
calendar.set(Calendar.MONTH, 5);
5);
calendar.set(Calendar.DAY_OF_MONTH,
calendar.set(Calendar.DAY_OF_MONTH, 17);
17);
calendar.set(Calendar.HOUR_OF_DAY,
calendar.set(Calendar.HOUR_OF_DAY, 23);
23);
calendar.set(Calendar.MINUTE,
calendar.set(Calendar.MINUTE, 45);
45);
calendar.set(Calendar.SECOND,
calendar.set(Calendar.SECOND, 58);
58);
calendar.set(Calendar.MILLISECOND,
calendar.set(Calendar.MILLISECOND, 731);
731);
}}
}}
System.out.println(simpleFormat.format(calendar.getTime()));
System.out.println(simpleFormat.format(calendar.getTime()));
1984-06-17
1984-06-17 23:45:58.731
23:45:58.731
37

38. Увеличение даты и времени

public
public class
class CalendarAddDemo
CalendarAddDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.set(Calendar.MONTH,
calendar.set(Calendar.MONTH, 0);
0);
calendar.set(Calendar.DAY_OF_MONTH,
calendar.set(Calendar.DAY_OF_MONTH, 31);
31);
calendar.set(Calendar.YEAR,
calendar.set(Calendar.YEAR, 2011);
2011);
SimpleDateFormat
SimpleDateFormat formatter
formatter == new
new SimpleDateFormat("MMM
SimpleDateFormat("MMM dd,
dd, yyyy");
yyyy");
System.out.println("Before
System.out.println("Before adding:
adding: "" ++ formatter.format(calendar.getTime()));
formatter.format(calendar.getTime()));
calendar.add(Calendar.MONTH,
calendar.add(Calendar.MONTH, 13);
13);
}}
}}
System.out.println("After
System.out.println("After adding:
adding: "" ++ formatter.format(calendar.getTime()));
formatter.format(calendar.getTime()));
Before
2011
Before adding:
adding: Jan
Jan 31,
31, 2011
2011
After
After adding:
adding: Feb
Feb 29,
29, 2012
2012
38

39. “Прокручивание” даты и времени

public
public class
class CalendarRollDemo
CalendarRollDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.set(Calendar.MONTH,
calendar.set(Calendar.MONTH, 0);
0);
calendar.set(Calendar.DAY_OF_MONTH,
calendar.set(Calendar.DAY_OF_MONTH, 31);
31);
calendar.set(Calendar.YEAR,
calendar.set(Calendar.YEAR, 2011);
2011);
SimpleDateFormat
SimpleDateFormat formatter
formatter == new
new SimpleDateFormat("MMM
SimpleDateFormat("MMM dd,
dd, yyyy");
yyyy");
System.out.println("Before
System.out.println("Before rolling:
rolling: "" ++ formatter.format(calendar.getTime()));
formatter.format(calendar.getTime()));
calendar.roll(Calendar.MONTH,
calendar.roll(Calendar.MONTH, 13);
13);
}}
}}
System.out.println("After
System.out.println("After rolling:
rolling: "" ++ formatter.format(calendar.getTime()));
formatter.format(calendar.getTime()));
Before
2011
Before rolling:
rolling: Jan
Jan 31,
31, 2011
2011
After
2011
After rolling:
rolling: Feb
Feb 28,
28, 2011
2011
39

40. Задание даты и времени

package
package java.util;
java.util;
public
public abstract
abstract class
class Calendar
Calendar implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Calendar>
Comparable<Calendar> {{
public
public final
final void
void set(int
set(int year,
year, int
int month,
month, int
int date)
date) {{
set(YEAR,
set(YEAR, year);
year);
set(MONTH,
set(MONTH, month);
month);
set(DATE,
date);
set(DATE, date);
}}
public
public final
final void
void set(int
set(int year,
year, int
int month,
month, int
int date,
date, int
int hourOfDay,
hourOfDay, int
int minute)
minute) {{
set(YEAR,
set(YEAR, year);
year);
set(MONTH,
set(MONTH, month);
month);
set(DATE,
date);
set(DATE, date);
set(HOUR_OF_DAY,
set(HOUR_OF_DAY, hourOfDay);
hourOfDay);
set(MINUTE,
set(MINUTE, minute);
minute);
}}
}}
public
public final
final void
void set(int
set(int year,
year, int
int month,
month, int
int date,
date, int
int hourOfDay,
hourOfDay, int
int minute,
minute, int
int second)
second) {{
set(YEAR,
set(YEAR, year);
year);
set(MONTH,
set(MONTH, month);
month);
set(DATE,
set(DATE, date);
date);
set(HOUR_OF_DAY,
set(HOUR_OF_DAY, hourOfDay);
hourOfDay);
set(MINUTE,
minute);
set(MINUTE, minute);
set(SECOND,
set(SECOND, second);
second);
}}
40

41. Задание даты и времени

public
public class
class CalendarSetDemo
CalendarSetDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
System.out.println("Current
System.out.println("Current time
time is:
is: "" ++ calendar.getTime());
calendar.getTime());
calendar.set(2020,
calendar.set(2020, 5,
5, 17,
17, 07,
07, 12,
12, 45);
45);
}}
}}
System.out.println("Altered
System.out.println("Altered time
time is:
is: "" ++ calendar.getTime());
calendar.getTime());
Current
Current time
time is:
is: Fri
Fri Jan
Jan 11
11 22:59:35
22:59:35 GMT+07:00
GMT+07:00 2013
2013
Altered
Altered time
time is:
is: Wed
Wed Jun
Jun 17
17 07:12:45
07:12:45 GMT+07:00
GMT+07:00 2020
2020
41

42. Задание даты и времени

public
public class
class CalendarSetPuzzle
CalendarSetPuzzle {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar1
calendar1 == new
new GregorianCalendar();
GregorianCalendar();
int
int year
year == 2012;
2012;
int
month
=
int month = Calendar.MARCH;
Calendar.MARCH;
int
day
=
23;
int day = 23;
calendar1.set(year,
calendar1.set(year, month,
month, day);
day);
int
int iterationCount
iterationCount == 1000;
1000;
boolean
boolean isEqual
isEqual == false;
false;
for
(int
i
=
0;
i
<
for (int i = 0; i < iterationCount;
iterationCount; i++)
i++) {{
final
final Calendar
Calendar calendar2
calendar2 == new
new GregorianCalendar();
GregorianCalendar();
calendar2.set(year,
calendar2.set(year, month,
month, day);
day);
}}
}}
}}
System.out.println(calendar1.equals(calendar2));
System.out.println(calendar1.equals(calendar2));
42

43. Задание даты и времени

...
...
true
true
true
true
true
true
true
true
false
false
false
false
false
false
false
false
...
...
43

44. Класс java.util.Calendar

package
package java.util;
java.util;
public
public abstract
abstract class
class Calendar
Calendar implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Calendar>
Comparable<Calendar> {{
private
private boolean
boolean lenient
lenient == true;
true;
public
public void
void setLenient(boolean
setLenient(boolean lenient)
lenient) {{
this.lenient
this.lenient == lenient;
lenient;
}}
}}
public
public boolean
boolean isLenient()
isLenient() {{
return
return lenient;
lenient;
}}
...
...
C
A
В классе Calendar объявлено поле lenient вместе с аксессором и мутатором. Это поле
определяет будет ли проверка изменений полей дат нестрогой или строгой. Если это
поле задано false попытка задать поле календаря за пределом допустимого диапазона
приведёт к выбрасыванию исключения. Если поле задано true при попытке задать поле
календаря за пределом допустимого диапазона будут меняться другие поля календаря.
44

45. Нестрогая проверка изменения полей

public
public class
class CalendarLenientDemo
CalendarLenientDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
System.out.println("Is
System.out.println("Is calendar
calendar lenient?
lenient? "" ++ calendar.isLenient());
calendar.isLenient());
calendar.set(2010,
calendar.set(2010, 0,
0, 1);
1);
System.out.println(calendar.getTime());
System.out.println(calendar.getTime());
}}
}}
calendar.set(2010,
calendar.set(2010, Calendar.FEBRUARY,
Calendar.FEBRUARY, 29);
29);
System.out.println(calendar.getTime());
System.out.println(calendar.getTime());
Is
Is calendar
calendar lenient?
lenient? true
true
Fri
Jan
01
Fri Jan
Jan 01
01 15:19:49
15:19:49 GMT+07:00
GMT+07:00 2010
2010
Jan
01
Mon
Mar
01
Mon Mar
Mar 01
01 15:19:49
15:19:49 GMT+07:00
GMT+07:00 2010
2010
45

46. Строгая проверка изменения полей

public
public class
class CalendarNonLenientDemo
CalendarNonLenientDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.setLenient(false);
calendar.setLenient(false);
System.out.println("Is
System.out.println("Is calendar
calendar lenient?
lenient? "" ++ calendar.isLenient());
calendar.isLenient());
calendar.set(2010,
calendar.set(2010, 0,
0, 1);
1);
System.out.println(calendar.getTime());
System.out.println(calendar.getTime());
}}
}}
calendar.set(2010,
calendar.set(2010, Calendar.FEBRUARY,
Calendar.FEBRUARY, 29);
29);
System.out.println(calendar.getTime());
System.out.println(calendar.getTime());
Is
Is calendar
calendar lenient?
lenient? false
false
Fri
Fri Jan
Jan 01
01 15:21:59
15:21:59 GMT+07:00
GMT+07:00 2010
2010
Exception
Exception in
in thread
thread "main"
"main" java.lang.IllegalArgumentException:
java.lang.IllegalArgumentException: MONTH:
MONTH: 11 ->
-> 22
at
at java.util.GregorianCalendar.computeTime(Unknown
java.util.GregorianCalendar.computeTime(Unknown Source)
Source)
at
java.util.Calendar.updateTime(Unknown
Source)
at java.util.Calendar.updateTime(Unknown Source)
at
at java.util.Calendar.getTimeInMillis(Unknown
java.util.Calendar.getTimeInMillis(Unknown Source)
Source)
at
at java.util.Calendar.getTime(Unknown
java.util.Calendar.getTime(Unknown Source)
Source)
at
at dates.CalendarNonLenientDemo.main(CalendarNonLenientDemo.java:19)
dates.CalendarNonLenientDemo.main(CalendarNonLenientDemo.java:19)
46

47. Часовые зоны

package
package java.util;
java.util;
public
public abstract
abstract class
class Calendar
Calendar implements
implements Serializable,
Serializable, Cloneable,
Cloneable, Comparable<Calendar>
Comparable<Calendar> {{
}}
public
public TimeZone
TimeZone getTimeZone()
getTimeZone()
public
public void
void setTimeZone(TimeZone
setTimeZone(TimeZone zone)
zone)
...
...
C
A
В классе Calendar определены методы для задания и получения часовых зон. Метод
getTimeZone возвращает часовую зону связанную с экземпляром класса потомка
Calendar. Метод setTimeZone задаёт часовую зону связанную с экземпляром класса
потомка Calendar. Для того чтобы избежать ошибок лучше задавать часовую зону в
конструкторе GregorianCalendar.
47

48. Использование часовых зон

public
public class
class TimeZoneConversionDemo
TimeZoneConversionDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
TimeZone
TimeZone timeZoneMOW
timeZoneMOW == TimeZone.getTimeZone("Europe/Moscow");
TimeZone.getTimeZone("Europe/Moscow");
TimeZone
TimeZone timeZoneLA
timeZoneLA == TimeZone.getTimeZone("America/Los_Angeles");
TimeZone.getTimeZone("America/Los_Angeles");
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.setTimeZone(timeZoneMOW);
calendar.setTimeZone(timeZoneMOW);
long
long timeMOW
timeMOW == calendar.getTimeInMillis();
calendar.getTimeInMillis();
System.out.println("time
== "" ++ timeMOW);
System.out.println("time Moscow
Moscow
timeMOW);
System.out.println("hour
== "" ++ calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("hour
calendar.get(Calendar.HOUR_OF_DAY));
calendar.setTimeZone(timeZoneLA);
calendar.setTimeZone(timeZoneLA);
}}
}}
long
long timeLA
timeLA == calendar.getTimeInMillis();
calendar.getTimeInMillis();
System.out.println("time
System.out.println("time Los
Los Angeles
Angeles == "" ++ timeLA);
timeLA);
System.out.println("hour
== "" ++ calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("hour
calendar.get(Calendar.HOUR_OF_DAY));
time
time Moscow
Moscow
hour
hour
time
time Los
Los Angeles
Angeles
hour
hour
==
==
==
==
1370852587812
1370852587812
12
12
1370852587812
1370852587812
111
48

49.

Форматирование, разбор и валидация даты и
времени
49

50.

50

51. Класс java.text.DateFormat

package
package java.text;
java.text;
public
public abstract
abstract class
class DateFormat
DateFormat extends
extends Format{
Format{
protected
protected Calendar
Calendar calendar;
calendar;
public
public
public
public
final
final String
String format(Date
format(Date date)
date)
Date
parse(String
source)
Date parse(String source) throws
throws ParseException
ParseException
public
public boolean
boolean isLenient()
isLenient()
public
public void
void setLenient(boolean
setLenient(boolean lenient)
lenient)
public
public TimeZone
TimeZone getTimeZone()
getTimeZone()
public
public void
void setTimeZone(TimeZone
setTimeZone(TimeZone zone)
zone)
public
public
public
public
}}
Calendar
Calendar getCalendar()
getCalendar()
void
setCalendar(Calendar
void setCalendar(Calendar newCalendar)
newCalendar)
...
...
C
A
В абстрактном классе DateFormat определены методы для форматирования и разбора
времени и даты. Чтобы воспользоваться этими методами как правило создаётся
экземпляр класса потомка SimpleDateFormat. Если не задавать часовую зону и
календарь будут использованы часовая зона и календарь по умолчанию, что может
привести к ошибкам. Класс SimpleDateFormat не является потокобезопасным.
51

52. Форматирование даты и времени

public
public class
class DateFormattingDemo
DateFormattingDemo {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
Format
Format formatter;
formatter;
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.set(Calendar.YEAR,1984);
calendar.set(Calendar.YEAR,1984);
calendar.set(Calendar.MONTH,5);
calendar.set(Calendar.MONTH,5);
calendar.set(Calendar.DAY_OF_MONTH,17);
calendar.set(Calendar.DAY_OF_MONTH,17);
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.MINUTE,45);
calendar.set(Calendar.MINUTE,45);
calendar.set(Calendar.SECOND,58);
calendar.set(Calendar.SECOND,58);
calendar.set(Calendar.MILLISECOND,731);
calendar.set(Calendar.MILLISECOND,731);
Date
Date date
date == calendar.getTime();
calendar.getTime();
formatter
formatter == new
new SimpleDateFormat("MM/dd/yy");
SimpleDateFormat("MM/dd/yy");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter
formatter == new
new SimpleDateFormat("dd/MM/yy");
SimpleDateFormat("dd/MM/yy");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter
formatter == new
new SimpleDateFormat("dd-MMM-yy");
SimpleDateFormat("dd-MMM-yy");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter
formatter == new
new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter
formatter == new
new SimpleDateFormat("E,
SimpleDateFormat("E, dd
dd MMM
MMM yyyy
yyyy HH:mm:ss
HH:mm:ss Z");
Z");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
}}
}}
formatter
formatter == new
new SimpleDateFormat("EEEE,
SimpleDateFormat("EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss
HH:mm:ss zzzz");
zzzz");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
52

53. Форматирование даты и времени

06/17/84
06/17/84
17/06/84
17/06/84
17-Jun-84
17-Jun-84
1984.06.17.23.45.58
1984.06.17.23.45.58
Sun,
Sun, 17
17 Jun
Jun 1984
1984 23:45:58
23:45:58 +0700
+0700
Sunday,
17
June
1984
23:45:58
Sunday, 17 June 1984 23:45:58 GMT+07:00
GMT+07:00
53

54. Форматирование даты и времени с заданием часовой зоны

public
public class
class DateFormattingTzDemo
DateFormattingTzDemo {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
SimpleDateFormat
SimpleDateFormat formatter;
formatter;
Calendar
Calendar calendar
calendar == new
new GregorianCalendar();
GregorianCalendar();
calendar.set(Calendar.YEAR,1984);
calendar.set(Calendar.YEAR,1984);
calendar.set(Calendar.MONTH,5);
calendar.set(Calendar.MONTH,5);
calendar.set(Calendar.DAY_OF_MONTH,17);
calendar.set(Calendar.DAY_OF_MONTH,17);
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.MINUTE,45);
calendar.set(Calendar.MINUTE,45);
calendar.set(Calendar.SECOND,58);
calendar.set(Calendar.SECOND,58);
calendar.set(Calendar.MILLISECOND,731);
calendar.set(Calendar.MILLISECOND,731);
Date
Date date
date == calendar.getTime();
calendar.getTime();
formatter
formatter == new
new SimpleDateFormat("EEEE,
SimpleDateFormat("EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss
HH:mm:ss zzzz");
zzzz");
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("GMT+0200"));
formatter.setTimeZone(TimeZone.getTimeZone("GMT+0200"));
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
}}
}}
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
Sunday,
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
17
17
17
17
17
17
17
17
June
June
June
June
June
June
June
June
1984
1984
1984
1984
1984
1984
1984
1984
23:45:58
23:45:58
17:45:58
17:45:58
19:45:58
19:45:58
08:45:58
08:45:58
Novosibirsk
Novosibirsk Summer
Summer Time
Time
GMT+02:00
GMT+02:00
Moscow
Moscow Daylight
Daylight Time
Time
Pacific
Pacific Daylight
Daylight Time
Time
54

55. Разбор даты и времени

public
public class
class DateParsingDemo
DateParsingDemo {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
DateFormat
DateFormat formatter
formatter == new
new SimpleDateFormat("EEEE,
SimpleDateFormat("EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss
HH:mm:ss zzzzz");
zzzzz");
try
try {{
//On
//On that
that date
date Asia/Novosibirsk
Asia/Novosibirsk was
was GMT+08:00
GMT+08:00
Date
Date date
date == formatter.parse("Sunday,
formatter.parse("Sunday, 17
17 June
June 1984
1984 23:45:58
23:45:58 GMT+03:00");
GMT+03:00");
Calendar
Calendar calendar
calendar == new
new GregorianCalendar(TimeZone.getTimeZone("Asia/Novosibirsk"));
GregorianCalendar(TimeZone.getTimeZone("Asia/Novosibirsk"));
calendar.setTime(date);
calendar.setTime(date);
int
int
int
int
int
int
int
int
int
int
int
int
year
year == calendar.get(Calendar.YEAR);
calendar.get(Calendar.YEAR);
month
month == calendar.get(Calendar.MONTH);
calendar.get(Calendar.MONTH);
dayOfMonth
dayOfMonth == calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.DAY_OF_MONTH);
hourOfDay
=
calendar.get(Calendar.HOUR_OF_DAY);
hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
minute
minute == calendar.get(Calendar.MINUTE);
calendar.get(Calendar.MINUTE);
second
second == calendar.get(Calendar.SECOND);
calendar.get(Calendar.SECOND);
System.out.println("year:
System.out.println("year: "" ++ year
year ++ ",
", month:
month: "" ++ month
month
++ ",
dayOfMonth:
"
+
dayOfMonth
+
",
hourOfDay:
", dayOfMonth: " + dayOfMonth + ", hourOfDay: ""
++ hourOfDay
hourOfDay ++ ",
", minute:
minute: "" ++ minute
minute ++ ",
", second:
second: ""
++ second);
second);
}}
}}
}} catch
catch (ParseException
(ParseException e)
e) {{
e.printStackTrace();
e.printStackTrace();
}}
year:
year: 1984,
1984, month:
month: 5,
5, dayOfMonth:
dayOfMonth: 18,
18, hourOfDay:
hourOfDay: 4,
4, minute:
minute: 45,
45, second:
second: 58
58
55

56. Разбор даты и времени с заданием часовой зоны

public
public class
class DateParsingTzDemo
DateParsingTzDemo {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
DateFormat
DateFormat formatter;
formatter;
formatter
formatter == new
new SimpleDateFormat("EEEE,
SimpleDateFormat("EEEE, dd
dd MMMM
MMMM yyyy
yyyy HH:mm:ss");
HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
try
try {{
Date
Date date
date == formatter.parse("Sunday,
formatter.parse("Sunday, 17
17 June
June 1984
1984 23:45:58");
23:45:58");
Calendar
Calendar calendar
calendar == new
new GregorianCalendar(
GregorianCalendar(
TimeZone.getTimeZone("Asia/Novosibirsk"));
TimeZone.getTimeZone("Asia/Novosibirsk"));
calendar.setTime(date);
calendar.setTime(date);
int
int
int
int
int
int
int
int
int
int
int
int
year
year == calendar.get(Calendar.YEAR);
calendar.get(Calendar.YEAR);
month
month == calendar.get(Calendar.MONTH);
calendar.get(Calendar.MONTH);
dayOfMonth
dayOfMonth == calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.DAY_OF_MONTH);
hourOfDay
hourOfDay == calendar.get(Calendar.HOUR_OF_DAY);
calendar.get(Calendar.HOUR_OF_DAY);
minute
minute == calendar.get(Calendar.MINUTE);
calendar.get(Calendar.MINUTE);
second
=
calendar.get(Calendar.SECOND);
second = calendar.get(Calendar.SECOND);
System.out.println("year:
System.out.println("year: "" ++ year
year ++ ",
", month:
month: "" ++ month
month
++ ",
", dayOfMonth:
dayOfMonth: "" ++ dayOfMonth
dayOfMonth ++ ",
", hourOfDay:
hourOfDay: ""
++ hourOfDay
hourOfDay ++ ",
", minute:
minute: "" ++ minute
minute ++ ",
", second:
second: ""
++ second);
second);
}}
}}
}} catch
catch (ParseException
(ParseException e)
e) {{
e.printStackTrace();
e.printStackTrace();
}}
year:
year: 1984,
1984, month:
month: 5,
5, dayOfMonth:
dayOfMonth: 18,
18, hourOfDay:
hourOfDay: 4,
4, minute:
minute: 45,
45, second:
second: 58
58
56

57. Нестрогая валидация

public
public class
class LenientValidationDemo
LenientValidationDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
SimpleDateFormat
SimpleDateFormat formatter
formatter == new
new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat("dd/MM/yyyy");
System.out.println("Is
System.out.println("Is formatter
formatter lenient?
lenient? "" ++ formatter.isLenient());
formatter.isLenient());
String[]
String[] strings
strings == {{ "40/20/2015",
"40/20/2015", "10//10/2015",
"10//10/2015", "50/60/2015",
"50/60/2015", "10.10.2015",
"10.10.2015", "10/10/2015"
"10/10/2015" };
};
for
for (String
(String string
string :: strings)
strings) {{
try
try {{
Date
Date date
date == formatter.parse(string);
formatter.parse(string);
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
}}
}}
}}
}} catch
catch (ParseException
(ParseException e)
e) {{
System.out.println("Incorrect
System.out.println("Incorrect date
date format.
format. "" ++ e.getMessage());
e.getMessage());
}}
Is
Is formatter
formatter lenient?
lenient? true
true
09/09/2016
09/09/2016
Incorrect
Incorrect date
date format.
format. Unparseable
Unparseable date:
date: "10//10/2015"
"10//10/2015"
19/01/2020
19/01/2020
Incorrect
Incorrect date
date format.
format. Unparseable
Unparseable date:
date: "10.10.2015"
"10.10.2015"
10/10/2015
10/10/2015
57

58. Строгая валидация

public
public class
class NonLenientValidationDemo
NonLenientValidationDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
SimpleDateFormat
SimpleDateFormat formatter
formatter == new
new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat("dd/MM/yyyy");
formatter.setLenient(false);
formatter.setLenient(false);
System.out.println("Is
System.out.println("Is formatter
formatter lenient?
lenient? "" ++ formatter.isLenient());
formatter.isLenient());
String[]
String[] strings
strings == {{ "40/20/2015",
"40/20/2015", "10//10/2015",
"10//10/2015", "50/60/2015",
"50/60/2015", "10.10.2015",
"10.10.2015", "10/10/2015"
"10/10/2015" };
};
for
for (String
(String string
string :: strings)
strings) {{
try
try {{
Date
Date date
date == formatter.parse(string);
formatter.parse(string);
System.out.println(formatter.format(date));
System.out.println(formatter.format(date));
}}
}}
}}
}} catch
catch (ParseException
(ParseException e)
e) {{
System.out.println("Incorrect
System.out.println("Incorrect date
date format.
format. "" ++ e.getMessage());
e.getMessage());
}}
Is
Is formatter
formatter lenient?
lenient? false
false
Incorrect
Incorrect date
date format.
format. Unparseable
Unparseable
Incorrect
Incorrect date
date format.
format. Unparseable
Unparseable
Incorrect
Incorrect date
date format.
format. Unparseable
Unparseable
Incorrect
date
format.
Unparseable
Incorrect date format. Unparseable
10/10/2015
10/10/2015
date:
date:
date:
date:
date:
date:
date:
date:
"40/20/2015"
"40/20/2015"
"10//10/2015"
"10//10/2015"
"50/60/2015"
"50/60/2015"
"10.10.2015"
"10.10.2015"
58

59.

Класс SimpleDateFormat не является потокобезопасным.
При использовании несколькими потоками объекта класса
SimpleDateFormat возможно получение неправильных
результатов и выбрасывание исключений.
59
English     Русский Rules