Skip to content

Commit 45b21ba

Browse files
committed
#10 secao de ZonedDateTime, revisao pendente
1 parent 899619a commit 45b21ba

File tree

10 files changed

+326
-0
lines changed

10 files changed

+326
-0
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
:java-package: src/org/j6toj8/localization
2+
:section-java-package: ../../../{java-package}
3+
4+
=== Time Zones
5+
6+
.Objetivo
7+
--------------------------------------------------
8+
Work with dates and times across time zones and manage changes resulting from daylight savings.
9+
-
10+
Trabalhe com datas e horas entre fusos horários e gerencie alterações resultantes de horários de verão.
11+
--------------------------------------------------
12+
13+
O exame de certificação espera que você consiga lidar com diferentes fusos horários, além de conseguir entender o que ocorre ao realizar operações com datas e horas que passam por um horário de verão.
14+
15+
Nessa seção será apresenta a classe `ZonedDateTime`, que armazena Data, Hora e um fuso horário. Ou seja, é muito parecida com a classe `LocalDateTime`, porém possui um fuso horário.
16+
17+
A representação de um `ZonedDateTime` é `2007-12-03T10:15:30+01:00 Europe/Paris`.
18+
19+
. É possível criar um `ZonedDateTime` através do método `static` chamado `now`.
20+
+
21+
[source,java,indent=0]
22+
.{java-package}/timezones/ZonedDateTime_Now.java
23+
----
24+
include::{section-java-package}/timezones/ZonedDateTime_Now.java[tag=code]
25+
----
26+
+
27+
.Saída no console
28+
[source,console]
29+
----
30+
2019-06-09T18:10:08.863-03:00[America/Sao_Paulo]
31+
----
32+
+
33+
A saída no console irá apresentar a data e hora atual, e o fuso horário de onde o código está sendo executado.
34+
35+
. Também é possível criar um `LocalDate` através do método `static` chamado `of`.
36+
+
37+
[source,java,indent=0]
38+
.{java-package}/timezones/ZonedDateTime_Of.java
39+
----
40+
include::{section-java-package}/timezones/ZonedDateTime_Of.java[tag=code]
41+
----
42+
+
43+
.Saída no console
44+
[source,console]
45+
----
46+
2019-06-09T13:20:03.000001-03:00[America/Sao_Paulo]
47+
2019-06-09T13:20:03.000001-03:00[America/Sao_Paulo]
48+
2019-06-09T13:20:03.000001-03:00[America/Sao_Paulo]
49+
----
50+
+
51+
Perceba que é possível criar um `ZonedDateTime` diretamente, ou através de um `LocalDateTime`, ou com uma junção de um `LocalDate` e um `LocalTime`. Perceba também que em todos os casos é necessário informar o fuso horário.
52+
53+
. Assim como todas a novas classes de data e hora, não é possível criar uma instância de `ZonedDateTime` utilizando o construtor.
54+
+
55+
[source,java,indent=0]
56+
.{java-package}/timezones/ZonedDateTime_Constructor.java
57+
----
58+
include::{section-java-package}/timezones/ZonedDateTime_Constructor.java[tag=code]
59+
----
60+
61+
. Será lançada a exceção `DateTimeException` ao tentar criar uma data inválida.
62+
+
63+
[source,java,indent=0]
64+
.{java-package}/timezones/ZonedDateTime_Invalid.java
65+
----
66+
include::{section-java-package}/timezones/ZonedDateTime_Invalid.java[tag=code]
67+
----
68+
+
69+
.Saída no console
70+
[source,console]
71+
----
72+
Exception in thread "main" java.time.DateTimeException: Invalid date 'APRIL 31'
73+
at java.time.LocalDate.create(LocalDate.java:431)
74+
at java.time.LocalDate.of(LocalDate.java:269)
75+
at java.time.LocalDateTime.of(LocalDateTime.java:361)
76+
at java.time.ZonedDateTime.of(ZonedDateTime.java:339)
77+
at org.j6toj8.localization.timezones.ZonedDateTime_Invalid.main(ZonedDateTime_Invalid.java:10)
78+
----
79+
80+
. Existem vários métodos para somar e subtrair de `ZonedDateTime`
81+
+
82+
[source,java,indent=0]
83+
.{java-package}/timezones/ZonedDateTime_Manipulate.java
84+
----
85+
include::{section-java-package}/timezones/ZonedDateTime_Manipulate.java[tag=code]
86+
----
87+
+
88+
.Saída no console
89+
[source,console]
90+
----
91+
2019-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
92+
+2 horas: 2019-05-20T11:20:12.000001-03:00[America/Sao_Paulo]
93+
+2 minutos: 2019-05-20T09:22:12.000001-03:00[America/Sao_Paulo]
94+
+2 segundos: 2019-05-20T09:20:14.000001-03:00[America/Sao_Paulo]
95+
+2 nanosegundos: 2019-05-20T09:20:12.000001002-03:00[America/Sao_Paulo]
96+
+2 microssegundos: 2019-05-20T09:20:12.000003-03:00[America/Sao_Paulo]
97+
+2 milissegundos: 2019-05-20T09:20:12.002001-03:00[America/Sao_Paulo]
98+
-2 horas: 2019-05-20T07:20:12.000001-03:00[America/Sao_Paulo]
99+
-2 minutos: 2019-05-20T09:18:12.000001-03:00[America/Sao_Paulo]
100+
-2 segundos: 2019-05-20T09:20:10.000001-03:00[America/Sao_Paulo]
101+
-2 nanosegundos: 2019-05-20T09:20:12.000000998-03:00[America/Sao_Paulo]
102+
-2 microssegundos: 2019-05-20T09:20:11.999999-03:00[America/Sao_Paulo]
103+
-2 milissegundos: 2019-05-20T09:20:11.998001-03:00[America/Sao_Paulo]
104+
+2 dias: 2019-05-22T09:20:12.000001-03:00[America/Sao_Paulo]
105+
+2 semanas: 2019-06-03T09:20:12.000001-03:00[America/Sao_Paulo]
106+
+2 meses: 2019-07-20T09:20:12.000001-03:00[America/Sao_Paulo]
107+
+2 anos: 2021-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
108+
+2 anos: 2021-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
109+
+2 décadas: 2039-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
110+
-2 dias: 2019-05-18T09:20:12.000001-03:00[America/Sao_Paulo]
111+
-2 semanas: 2019-05-06T09:20:12.000001-03:00[America/Sao_Paulo]
112+
-2 meses: 2019-03-20T09:20:12.000001-03:00[America/Sao_Paulo]
113+
-2 anos: 2017-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
114+
-2 décadas: 1999-05-20T09:20:12.000001-03:00[America/Sao_Paulo]
115+
----
116+
117+
. `ZonedDateTime` é imutável, então é necessário armazenar o retorno de uma alteração em uma variável.
118+
+
119+
[source,java,indent=0]
120+
.{java-package}/timezones/ZonedDateTime_Immutability.java
121+
----
122+
include::{section-java-package}/timezones/ZonedDateTime_Immutability.java[tag=code]
123+
----
124+
+
125+
.Saída no console
126+
[source,console]
127+
----
128+
2019-05-20T09:20:03.000000300-03:00[America/Sao_Paulo]
129+
2019-05-20T09:20:03.000000300-03:00[America/Sao_Paulo]
130+
2019-05-20T10:20:03.000000300-03:00[America/Sao_Paulo]
131+
----
132+
133+
. É comum utilizar o encadeamento de chamadas com esses métodos.
134+
+
135+
[source,java,indent=0]
136+
.{java-package}/timezones/ZonedDateTime_Chaining.java
137+
----
138+
include::{section-java-package}/timezones/ZonedDateTime_Chaining.java[tag=code]
139+
----
140+
+
141+
.Saída no console
142+
[source,console]
143+
----
144+
2019-05-20T09:20:04.000000300-03:00[America/Sao_Paulo]
145+
2020-05-21T10:20:04.000000300-03:00[America/Sao_Paulo]
146+
----
147+
148+
. Ao manipular um `ZonedDateTime`, será levado em conta o horário de verão daquele fuso horário.
149+
+
150+
[source,java,indent=0]
151+
.{java-package}/timezones/ZonedDateTime_DaylightSavings.java
152+
----
153+
include::{section-java-package}/timezones/ZonedDateTime_DaylightSavings.java[tag=code]
154+
----
155+
+
156+
.Saída no console
157+
[source,console]
158+
----
159+
2018-11-03T23:30-03:00[America/Sao_Paulo]
160+
+2 horas: 2018-11-04T02:30-02:00[America/Sao_Paulo]
161+
----
162+
+
163+
Perceba que, nesse exemplo, o fuso horário que era `-03:00` virou `-02:00`, pois esse foi o dia em que teve início o horário de verão no Brasil. Perceba também que, por conta do horário de verão, ao somar 2 horas às `23:30`, fomos para `02:30` do dia seguinte. Se não houvesse horário de verão, teríamos ido para `01:30`.
164+
165+
.Referências
166+
****
167+
168+
* Working with Dates and Times
169+
+
170+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 234). Wiley. Edição do Kindle.
171+
172+
* https://www.baeldung.com/java-8-date-time-intro[Introduction to the Java 8 Date/Time API.]
173+
174+
* https://docs.oracle.com/javase/tutorial/datetime/TOC.html[Trail: Date Time: Table of Contents.] The Java™ Tutorials.
175+
176+
* https://stackoverflow.com/questions/32437550/whats-the-difference-between-instant-and-localdatetime/32443004[What's the difference between Instant and LocalDateTime?]
177+
178+
****

ch03-localization.asc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ TODO... (escrever algo sobre esta sessão?)
66
include::book/03-localization/sections/01-locale.asc[]
77
include::book/03-localization/sections/02-resource-bundle.asc[]
88
include::book/03-localization/sections/03-date-time.asc[]
9+
include::book/03-localization/sections/05-time-zones.asc[]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZoneId;
4+
import java.time.ZonedDateTime;
5+
6+
public class ZonedDateTime_Chaining {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
ZonedDateTime zonedDateTime = ZonedDateTime.of(2019, 5, 20, 9, 20, 4, 300, ZoneId.of("America/Sao_Paulo"));
11+
System.out.println(zonedDateTime);
12+
System.out.println(zonedDateTime.plusDays(1).plusHours(1).plusYears(1));
13+
// end::code[]
14+
}
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZonedDateTime;
4+
5+
public class ZonedDateTime_Constructor {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
ZonedDateTime zonedDateTime = new ZonedDateTime(); // NÃO COMPILA! - não possui construtor público
10+
System.out.println(zonedDateTime);
11+
// end::code[]
12+
}
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZoneId;
4+
import java.time.ZonedDateTime;
5+
6+
public class ZonedDateTime_DaylightSavings {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
ZonedDateTime zonedDateTime = ZonedDateTime.of(2018, 11, 3, 23, 30, 0, 0, ZoneId.of("America/Sao_Paulo"));
11+
System.out.println(zonedDateTime);
12+
System.out.println("+2 horas: " + zonedDateTime.plusHours(2));
13+
// end::code[]
14+
}
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZoneId;
4+
import java.time.ZonedDateTime;
5+
6+
public class ZonedDateTime_Immutability {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
ZonedDateTime zonedDateTime = ZonedDateTime.of(2019, 5, 20, 9, 20, 3, 300, ZoneId.of("America/Sao_Paulo"));
11+
System.out.println(zonedDateTime);
12+
zonedDateTime.plusHours(1); // chamada perdida - a nova data/hora não foi armazenada em uma variável
13+
System.out.println(zonedDateTime);
14+
zonedDateTime = zonedDateTime.plusHours(1); // chamada útil - data/hora armazenada na variável
15+
System.out.println(zonedDateTime);
16+
// end::code[]
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZoneId;
4+
import java.time.ZonedDateTime;
5+
6+
public class ZonedDateTime_Invalid {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
System.out.println(ZonedDateTime.of(2019, 4, 31, 9, 20, 3, 1000, ZoneId.of("America/Sao_Paulo"))); // lança exceção: não existe 31 de abril
11+
// end::code[]
12+
}
13+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZoneId;
4+
import java.time.ZonedDateTime;
5+
import java.time.temporal.ChronoUnit;
6+
7+
public class ZonedDateTime_Manipulate {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
ZonedDateTime zonedDateTime = ZonedDateTime.of(2019, 5, 20, 9, 20, 12, 1000, ZoneId.of("America/Sao_Paulo"));
12+
System.out.println(zonedDateTime);
13+
System.out.println("+2 horas: " + zonedDateTime.plusHours(2));
14+
System.out.println("+2 minutos: " + zonedDateTime.plusMinutes(2));
15+
System.out.println("+2 segundos: " + zonedDateTime.plusSeconds(2));
16+
System.out.println("+2 nanosegundos: " + zonedDateTime.plusNanos(2));
17+
System.out.println("+2 microssegundos: " + zonedDateTime.plus(2, ChronoUnit.MICROS));
18+
System.out.println("+2 milissegundos: " + zonedDateTime.plus(2, ChronoUnit.MILLIS));
19+
System.out.println("-2 horas: " + zonedDateTime.minusHours(2));
20+
System.out.println("-2 minutos: " + zonedDateTime.minusMinutes(2));
21+
System.out.println("-2 segundos: " + zonedDateTime.minusSeconds(2));
22+
System.out.println("-2 nanosegundos: " + zonedDateTime.minusNanos(2));
23+
System.out.println("-2 microssegundos: " + zonedDateTime.minus(2, ChronoUnit.MICROS));
24+
System.out.println("-2 milissegundos: " + zonedDateTime.minus(2, ChronoUnit.MILLIS));
25+
System.out.println("+2 dias: " + zonedDateTime.plusDays(2));
26+
System.out.println("+2 semanas: " + zonedDateTime.plusWeeks(2));
27+
System.out.println("+2 meses: " + zonedDateTime.plusMonths(2));
28+
System.out.println("+2 anos: " + zonedDateTime.plusYears(2));
29+
System.out.println("+2 anos: " + zonedDateTime.plusYears(2));
30+
System.out.println("+2 décadas: " + zonedDateTime.plus(2, ChronoUnit.DECADES));
31+
System.out.println("-2 dias: " + zonedDateTime.minusDays(2));
32+
System.out.println("-2 semanas: " + zonedDateTime.minusWeeks(2));
33+
System.out.println("-2 meses: " + zonedDateTime.minusMonths(2));
34+
System.out.println("-2 anos: " + zonedDateTime.minusYears(2));
35+
System.out.println("-2 décadas: " + zonedDateTime.minus(2, ChronoUnit.DECADES));
36+
// end::code[]
37+
}
38+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.ZonedDateTime;
4+
5+
public class ZonedDateTime_Now {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
System.out.println(ZonedDateTime.now());
10+
// end::code[]
11+
}
12+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.j6toj8.localization.timezones;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
6+
import java.time.ZoneId;
7+
import java.time.ZonedDateTime;
8+
9+
public class ZonedDateTime_Of {
10+
11+
public static void main(String[] args) {
12+
// tag::code[]
13+
System.out.println(ZonedDateTime.of(2019, 6, 9, 13, 20, 3, 1000, ZoneId.of("America/Sao_Paulo")));
14+
15+
LocalDateTime localDateTime = LocalDateTime.of(2019, 6, 9, 13, 20, 3, 1000);
16+
System.out.println(ZonedDateTime.of(localDateTime, ZoneId.of("America/Sao_Paulo")));
17+
18+
LocalDate localDate = LocalDate.of(2019, 6, 9);
19+
LocalTime localTime = LocalTime.of(13, 20, 3, 1000);
20+
System.out.println(ZonedDateTime.of(localDate, localTime, ZoneId.of("America/Sao_Paulo")));
21+
// end::code[]
22+
}
23+
}

0 commit comments

Comments
 (0)