|
| 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 | +**** |
0 commit comments