Skip to content

Commit d2aeac0

Browse files
committed
#11 parte de DateFormat e SimpleDateFormat
1 parent 9ad7603 commit d2aeac0

5 files changed

Lines changed: 206 additions & 20 deletions

File tree

book/03-localization/sections/04-formats.asc

Lines changed: 103 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ Formatar datas, números e valores monetários para localização utilizando as
1212

1313
Ainda dentro das ideias de Localização e Internacionalização, é comum a necessidade de apresentar datas, números e valores monetários em diferentes formatos.
1414

15-
O exame de certificação compreende quatro classes principais de formatação:
15+
O exame de certificação compreende cinco classes principais de formatação:
1616

1717
* `NumberFormat` -> Formatação geral de números, valores monetários, percentuais e números inteiros com arredondamento, possivelmente baseados em `Locale`.
18-
* `DecimalFormat` -> Formatação de números quando há necessidade de definições mais específicas do formato.
18+
* `DecimalFormat` -> Formatação de números quando há necessidade de definições mais específicas ou personalizadas do formato.
19+
* `DateFormat` -> Formatação de data e hora antes do Java 8 utilizando formato predefinidos.
20+
* `SimpleDateFormat` -> Formatação de data e hora antes do Java 8 utilizando formatos mais específicos ou personalizados.
1921
* `DateTimeFormatter` -> Formatação de data e hora após o Java 8.
20-
* `DateFormat` -> Formatação de data e hora antes do Java 8.
2122

2223
==== NumberFormat
2324

@@ -129,7 +130,7 @@ No `Locale pt_BR`, temos o resultado esperado. Porém, no `Locale en_US` o `80,2
129130
==== DecimalFormat
130131

131132
Enquanto `NumberFormat` permite utilizar formatos predefinidos, `DecimalFormat` permite uma personalização maior. Um exemplo de formato para o `DecimalFormat` é `\#\##,\###.\###`.
132-
+
133+
133134
* `#` preenche a posição com um número, ou omite se não houver nada.
134135
* `0` preenche a posição com um número, ou 0 se não houver nada.
135136
* `.` indica onde é a posição do separador decimal.
@@ -185,6 +186,103 @@ include::{section-java-package}/formats/decimalformat/DecimalFormat_Strings.java
185186
Número 12.345,67 formatado
186187
----
187188

189+
==== DateFormat
190+
191+
Para formatar Data e Hora antes do Java 8, são utilizadas as classes de `DateFormat` e `SimpleDateFormat`. Essas classes trabalham em geral com a classe `Date` e fazem parte do pacote `java.text`, diferente de `DateTimeFormatter` que é do novo pacote `java.time.format`.
192+
193+
. Obter instâncias de `DateFormat` é muito parecido com `NumberFormat`.
194+
. É possível definir o formato das instâncias como `SHORT`, `MEDIUM`, `LONG` ou `FULL`.
195+
. É possível definir o `Locale` das instâncias.
196+
+
197+
[source,java,indent=0]
198+
.{java-package}/formats/dateformat/DateFormat_Instance.java
199+
----
200+
include::{section-java-package}/formats/dateformat/DateFormat_Instance.java[tag=code]
201+
----
202+
+
203+
.Saída no console
204+
[source,console]
205+
----
206+
08/09/2001
207+
22:46:40
208+
08/09/2001 22:46:40
209+
8 de Setembro de 2001 22h46min40s BRT
210+
September 8, 2001 10:46:40 PM BRT
211+
----
212+
213+
. Também é possível transformar `String` em `Date` utilizando o método `parse`.
214+
+
215+
[source,java,indent=0]
216+
.{java-package}/formats/dateformat/DateFormat_Parse.java
217+
----
218+
include::{section-java-package}/formats/dateformat/DateFormat_Parse.java[tag=code]
219+
----
220+
+
221+
.Saída no console
222+
[source,console]
223+
----
224+
Sat Sep 08 00:00:00 BRT 2001
225+
Thu Jan 01 22:46:00 BRT 1970
226+
Sat Sep 08 22:46:00 BRT 2001
227+
Unparseable date: "08/09/2001"
228+
----
229+
+
230+
Perceba que ocorreu uma exceção ao tentar converter uma data utilizando um formatar que espera Data e Hora.
231+
232+
==== SimpleDateFormat
233+
234+
A classe `SimpleDateFormat` permite criar formatos mais personalizados para apresentar Data e Hora, como `dd/MM/yyyy HH:mm:ss`. Seguem as letras mais importantes utilizadas na formatação para o exame:
235+
236+
* `y` -> Ano (2019, 19)
237+
* `M` -> Mês (8, 08, Ago, Agosto)
238+
* `d` -> Dia (06)
239+
* `h` -> Hora em formato AM/PM
240+
* `H` -> Hora em formato 24H
241+
* `m` -> Minutos
242+
* `s` -> Segundos
243+
244+
Em geral (existem exceções), quanto mais letras forem utilizadas, mais extenso é o formato apresentado. Por exemplo:
245+
246+
* `M` -> 8
247+
* `MM` -> 08
248+
* `MMM` -> Ago
249+
* `MMMM` -> Agosto
250+
251+
. É possível criar formatos personalizados para formatar um `Date` utilizando o construtor de `SimpleDateFormat`.
252+
+
253+
[source,java,indent=0]
254+
.{java-package}/formats/simpledateformat/SimpleDateFormat_Instance.java
255+
----
256+
include::{section-java-package}/formats/simpledateformat/SimpleDateFormat_Instance.java[tag=code]
257+
----
258+
+
259+
.Saída no console
260+
[source,console]
261+
----
262+
08 09 01 - 22 46 40
263+
08 09 01
264+
22 46 40
265+
----
266+
267+
. Também é possível criar `Date` a partir de `String` utilizando o método `parse`.
268+
+
269+
[source,java,indent=0]
270+
.{java-package}/formats/simpledateformat/SimpleDateFormat_Parse.java
271+
----
272+
include::{section-java-package}/formats/simpledateformat/SimpleDateFormat_Parse.java[tag=code]
273+
----
274+
+
275+
.Saída no console
276+
[source,console]
277+
----
278+
Sat Sep 08 22:46:40 BRT 2001
279+
Sat Sep 08 00:00:00 BRT 2001
280+
Thu Jan 01 22:46:40 BRT 1970
281+
Unparseable date: "22 46 40"
282+
----
283+
+
284+
Perceba a exceção ao tentar utilizar o formato incorreto.
285+
188286
==== DateTimeFormatter
189287

190288
O Java 8 traz a classe `DateTimeFormatter`, que possui várias formas de formatar e transformar `Data/Hora` em `String`, e vice-versa.
@@ -255,21 +353,8 @@ include::{section-java-package}/formats/datetimeformatter/DateTimeFormatter_Cust
255353
06 08 19 - 11 40 00
256354
----
257355
+
258-
Para criar um `DateTimeFormatter` personalizado, é necessário conhecer o que cada letra do formato representa. Seguem abaixo os mais importantes para o exame de certificação:
356+
Para criar um `DateTimeFormatter` personalizado, é necessário conhecer o que cada letra do formato representa. Volte na seção de `SimpleDateFormat` caso não se lembre.
259357
+
260-
* `y` -> Ano (2019, 19)
261-
* `M` -> Mês (8, 08, Ago, Agosto)
262-
* `d` -> Dia (06)
263-
* `h` -> Hora em formato AM/PM
264-
* `H` -> Hora em formato 24H
265-
* `m` -> Minutos
266-
* `s` -> Segundos
267-
+
268-
Em geral (existem exceções), quanto mais letras forem utilizadas, mais extenso é o formato apresentado. Por exemplo:
269-
* `M` -> 8
270-
* `MM` -> 08
271-
* `MMM` -> Ago
272-
* `MMMM` -> Agosto
273358

274359
. Não é possível formatar uma Data/Hora caso o objeto fornecido não tenha os campos necessários, como tentar apresentar a Data e fornecer um `LocalTime`.
275360
+
@@ -359,8 +444,6 @@ include::{section-java-package}/formats/datetimeformatter/DateTimeFormatter_Inve
359444
+
360445
Porém, veja que ao utilizar o método `parse` diretamente no `DateTimeFormatter`, é necessário converter o resultado para um `LocalDateTime`.
361446

362-
==== DateFormat
363-
364447

365448
.Referências
366449
****
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.j6toj8.localization.formats.dateformat;
2+
3+
import java.text.DateFormat;
4+
import java.util.Date;
5+
import java.util.Locale;
6+
7+
public class DateFormat_Instance {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
DateFormat dateInstance = DateFormat.getDateInstance();
12+
DateFormat timeInstance = DateFormat.getTimeInstance();
13+
DateFormat dateTimeInstance = DateFormat.getDateTimeInstance();
14+
DateFormat dateTimeLongInstance = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
15+
DateFormat dateTimeUSInstance = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US);
16+
17+
Date date = new Date(1000000000000L); // data em quantidade de milissegundos desde 01/01/1970
18+
19+
System.out.println(dateInstance.format(date));
20+
System.out.println(timeInstance.format(date));
21+
System.out.println(dateTimeInstance.format(date));
22+
System.out.println(dateTimeLongInstance.format(date));
23+
System.out.println(dateTimeUSInstance.format(date));
24+
// end::code[]
25+
}
26+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.j6toj8.localization.formats.dateformat;
2+
3+
import java.text.DateFormat;
4+
import java.text.ParseException;
5+
6+
public class DateFormat_Parse {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT);
11+
DateFormat timeInstance = DateFormat.getTimeInstance(DateFormat.SHORT);
12+
DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
13+
14+
String date = "08/09/2001";
15+
String time = "22:46:40";
16+
String dateTime = "08/09/2001 22:46:40";
17+
18+
try {
19+
System.out.println(dateInstance.parse(date));
20+
System.out.println(timeInstance.parse(time));
21+
System.out.println(dateTimeInstance.parse(dateTime));
22+
System.out.println(dateTimeInstance.parse(date)); // exceção, pois date não tem hora
23+
} catch (ParseException e) {
24+
System.out.println(e.getMessage());
25+
}
26+
// end::code[]
27+
}
28+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.j6toj8.localization.formats.simpledateformat;
2+
3+
import java.text.SimpleDateFormat;
4+
import java.util.Date;
5+
6+
public class SimpleDateFormat_Instance {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
SimpleDateFormat simpleDateTime = new SimpleDateFormat("dd MM yy - HH mm ss");
11+
SimpleDateFormat simpleDate = new SimpleDateFormat("dd MM yy");
12+
SimpleDateFormat simpleTime = new SimpleDateFormat("HH mm ss");
13+
14+
Date date = new Date(1000000000000L); // data em quantidade de milissegundos desde 01/01/1970
15+
16+
System.out.println(simpleDateTime.format(date));
17+
System.out.println(simpleDate.format(date));
18+
System.out.println(simpleTime.format(date));
19+
// end::code[]
20+
}
21+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.j6toj8.localization.formats.simpledateformat;
2+
3+
import java.text.ParseException;
4+
import java.text.SimpleDateFormat;
5+
6+
public class SimpleDateFormat_Parse {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
SimpleDateFormat simpleDateTime = new SimpleDateFormat("dd MM yy - HH mm ss");
11+
SimpleDateFormat simpleDate = new SimpleDateFormat("dd MM yy");
12+
SimpleDateFormat simpleTime = new SimpleDateFormat("HH mm ss");
13+
14+
String dateTime = "08 09 01 - 22 46 40";
15+
String date = "08 09 01";
16+
String time = "22 46 40";
17+
18+
try {
19+
System.out.println(simpleDateTime.parse(dateTime));
20+
System.out.println(simpleDate.parse(date));
21+
System.out.println(simpleTime.parse(time));
22+
System.out.println(simpleDateTime.parse(time)); // exceção, pois time não tem data
23+
} catch (ParseException e) {
24+
System.out.println(e.getMessage());
25+
}
26+
// end::code[]
27+
}
28+
}

0 commit comments

Comments
 (0)