Criando Datas e Horários
No mundo real, geralmente falamos de datas e fusos horários como se a outra pessoa estivesse localizado perto de nós. Por exemplo, se você disser "Eu ligo para você às 11:00 da manhã de terça-feira", suponha que 11:00 significa a mesma coisa para nós dois. Mas se você mora em Nova York e nós moramos na Califórnia, você precisa ser mais específico. Califórnia é três horas mais cedo que New York porque os estados estão em fusos horários diferentes. Em vez disso, você diria: "Vou ligar para você em 11:00 EST na manhã de terça-feira. " Felizmente, o exame não cobre os fusos horários, então discutir datas e horas são mais fáceis.
Ao trabalhar com datas e horas, a primeira coisa a fazer é decidir quanta informação você precisa. O exame oferece três opções:
LocalDate Contém apenas uma data - sem hora nem fuso horário. Um bom exemplo de LocalDate é seu aniversário este ano. É seu aniversário por um dia inteiro, independentemente de qual tempo é.
Horário local Contém apenas um momento - sem data e sem fuso horário. Um bom exemplo de LocalTime é meia-noite. É meia-noite à mesma hora todos os dias.
LocalDateTime Contém uma data e hora, mas nenhum fuso horário. Um bom exemplo de LocalDateTime é "o toque da meia-noite no Ano Novo". A meia-noite de 2 de janeiro não é quase tão especial, e claramente uma hora depois da meia-noite também não é tão especial.
A Oracle recomenda evitar fusos horários, a menos que você realmente precise deles. Tente agir como se todos estão no mesmo fuso horário quando você pode. Se você precisar se comunicar fusos horários, ZonedDateTime lida com eles.
Pronto para criar seus primeiros objetos de data e hora?
System.out.println(LocalDate.now());
System.out.println(LocalTime.now());
System.out.println(LocalDateTime.now());
Cada uma das três classes tem um método estático chamado now () que fornece a data atual e Tempo. Sua saída vai depender de qual data / hora você executá-lo e onde você mora. o autores residem nos Estados Unidos, fazendo com que a saída pareça com a seguinte quando executada em 20 de janeiro às 12h45:
2015-01-20
12:45:18.401
2015-01-20T12:45:18.401
A chave é notar o tipo de informação na saída. O primeiro contém apenas data e sem hora. O segundo contém apenas uma hora e nenhuma data. Desta vez, exibe horas, minutos, segundos e nanossegundos. O terceiro contém data e hora. Java usa T para separe a data e a hora ao converter LocalDateTime em uma String .
Espere - eu não vivo nos Estados Unidos
O exame reconhece que os participantes do exame vivem em todo o mundo e não perguntarão sobre os detalhes dos formatos de data e hora dos Estados Unidos.
Nos Estados Unidos, o mês é escrito antes da data. O exame não perguntará sobre a diferença entre 02/03/2015 e 03/02/2015. Isso seria mesquinho e não internacionalmente amigável, e estaria testando o seu conhecimento das datas dos Estados Unidos em vez do que o seu conhecimento de Java. Dito isto, nossos exemplos usam data e hora nos Estados Unidos formatos como as perguntas sobre o exame. Basta lembrar que o mês vem antes a data. Além disso, o Java tende a usar um relógio de 24 horas, embora os Estados Unidos usem Relógio de 12 horas com am / pm
Agora que você sabe como criar a data e a hora atuais, vamos ver outras datas e horas. Para começar, vamos criar apenas uma data sem tempo. Ambos os exemplos crie a mesma data:
LocalDate date1 = LocalDate.of(2015, Month.JANUARY, 20);
LocalDate date2 = LocalDate.of(2015, 1, 20);
Ambos passam no ano, mês e data. Embora seja bom usar as constantes do mês (para tornar o código mais fácil de ler), você pode passar o número int do mês diretamente. Basta usar o número do mês da mesma maneira que você faria se estivesse escrevendo a data na vida real.
As assinaturas do método são as seguintes:
public static LocalDate of(int year, int month, int dayOfMonth)
public static LocalDate of(int year, Month month, int dayOfMonth)
Mês é um tipo especial de classe chamado enum. Você não precisa saber sobre enums on o exame OCA e pode apenas tratá-los como constantes.
Até agora, temos sido como um disco quebrado informando que o Java conta começando com 0. Bem, os meses são uma exceção. Por meses na nova data e métodos de tempo, o Java conta a partir de 1 como nós, seres humanos.
Ao criar um horário, você pode escolher o quanto você deseja ser detalhado. Você pode especificar apenas a hora e o minuto, ou você pode adicionar o número de segundos. Você pode até adicionar nanoseconds se você quiser ser muito preciso. (Um nanossegundo é um bilionésimo de segundo - você provavelmente não precisa ser tão específico.)
LocalTime time1 = LocalTime.of(6, 15); // hour and minute
LocalTime time2 = LocalTime.of(6, 15, 30); // + seconds
LocalTime time3 = LocalTime.of(6, 15, 30, 200); // + nanoseconds
Estes três tempos são todos diferentes, mas dentro de um minuto um do outro. O método turas são as seguintes:
public static LocalTime of(int hour, int minute)
public static LocalTime of(int hour, int minute, int second)
public static LocalTime of(int hour, int minute, int second, int nanos)
Finalmente, podemos combinar datas e horas:
LocalDateTime dateTime1 = LocalDateTime.of(2015, Month.JANUARY, 20, 6, 15, 30);
LocalDateTime dateTime2 = LocalDateTime.of(date1, time1);
A primeira linha de código mostra como você pode especificar todas as informações sobre o LocalDateTime na mesma linha. Existem muitas assinaturas de métodos que permitem para especificar coisas diferentes. Ter tantos números seguidos é difícil de ler, Apesar. A segunda linha de código mostra como você pode criar LocalDate e LocalTime objetos separadamente primeiro e depois combiná-los para criar um objeto LocalDateTime .
Desta vez, há muitas assinaturas de métodos, pois há mais combinações. o assinaturas de métodos são as seguintes:
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second) public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanos)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanos)
public static LocalDateTime of(LocalDate date, LocalTime)
Você percebeu que não usamos um construtor em nenhum dos exemplos? A data e classes de tempo têm construtores privados para forçá-lo a usar os métodos estáticos. O exame os criadores podem tentar jogar algo assim em você:
LocalDate d = new LocalDate(); // DOES NOT COMPILE
Não caia nessa. Você não tem permissão para construir diretamente um objeto de data ou hora.
Outro truque é ver o que acontece quando você passa números inválidos para of () . Por exemplo:
LocalDate.of(2015, Month.JANUARY, 32) // throws DateTimeException
Você não precisa saber exatamente a exceção que foi lançada, mas é clara:
java.time.DateTimeException: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
Criando datas no Java 7 e no início
Você pode ver alguns dos problemas com o “modo antigo” na tabela a seguir. Lá Não era uma maneira de especificar apenas uma data sem o tempo. A classe Date representou tanto data e hora, quer você queira ou não. Tentando criar uma data específica necessária mais código do que deveria. Os índices do mês foram baseados em 0 em vez de 1, o que foi confuso.
Há uma maneira antiga de criar uma data. No Java 1.1, você criou uma data específica com esta: Data jan = new Date (2015, Calendar.JANUARY, 1); . Você poderia usar a classe Calendar começando com o Java 1.2. A data existe principalmente para retrocompatibilidade e para que O calendário pode trabalhar com código - tornando o “novo caminho” o terceiro caminho. O “novo caminho” é muito melhor, então parece que este é um caso da terceira vez é o encanto!