Trabalhando com Períodos
Agora sabemos o suficiente para fazer algo divertido com datas! Nosso zoológico realiza o enriquecimento animal atividades para dar aos animais algo divertido de fazer. O zelador chefe decidiu para trocar os brinquedos todos os meses. Este sistema continuará por três meses para ver como funciona.
public static void main(String[] args) {
LocalDate start = LocalDate.of(2015, Month.JANUARY, 1);
LocalDate end = LocalDate.of(2015, Month.MARCH, 30);
performAnimalEnrichment(start, end);
}
private static void performAnimalEnrichment(LocalDate start, LocalDate end) {
LocalDate upTo = start;
while (upTo.isBefore(end)) { // check if still before end
System.out.println("give new toy: " + upTo);
upTo = upTo.plusMonths(1); // add a month
}
}
Este código funciona bem. Adiciona um mês à data até atingir a data final. O problema é que esse método não pode ser reutilizado. Nosso zelador quer tentar horários diferentes para ver o que funciona melhor.
Convertendo para um long
LocalDate e LocalDateTime têm um método para convertê-los em equivalentes longos em relação 1970. O que é especial em 1970? Isso é o que o UNIX começou a usar para padrões de data, então o Java reutilizou. E não se preocupe - você não precisa memorizar os nomes para o exame.
■ LocalDate tem toEpochDay () , que é o número de dias desde 1º de janeiro de 1970.
■ LocalDateTime tem toEpochTime () , que é o número de segundos desde 1 de janeiro, 1970.
■ LocalTime não possui um método de época. Como representa um tempo que ocorre em qualquer data, não faz sentido compará-la em 1970. Embora o exame finja fusos horários não existem, você pode estar se perguntando se este especial 01 de janeiro de 1970 está em um fuso horário específico. A resposta é sim. Este tempo especial refere-se a quando era janeiro 1, 1970 em GMT (Greenwich Mean Time). Greenwich está na Inglaterra e GMT não participar do horário de verão. Isso faz com que seja um bom ponto de referência. (Você de novo não precisa saber sobre o GMT para o exame.)
Felizmente, o Java tem uma classe Period que podemos passar. Esse código faz a mesma coisa que o exemplo anterior:
public static void main(String[] args) {
LocalDate start = LocalDate.of(2015, Month.JANUARY, 1);
LocalDate end = LocalDate.of(2015, Month.MARCH, 30);
Period period = Period.ofMonths(1); // create a period
performAnimalEnrichment(start, end, period);
}
private static void performAnimalEnrichment(LocalDate start, LocalDate end,
Period period) { // uses the generic period
LocalDate upTo = start;
while (upTo.isBefore(end)) {
System.out.println("give new toy: " + upTo);
upTo = upTo.plus(period); // adds the period
}
}
O método pode adicionar um período de tempo arbitrário que é passado. Isso nos permite reutilize o mesmo método por diferentes períodos de tempo, pois o zelador muda de idéia.
Existem cinco maneiras de criar uma classe de período :
Period annually = Period.ofYears(1); // every 1 year
Period quarterly = Period.ofMonths(3); // every 3 months
Period everyThreeWeeks = Period.ofWeeks(3); // every 3 weeks
Period everyOtherDay = Period.ofDays(2); // every 2 days
Period everyYearAndAWeek = Period.of(1, 0, 7); // every year and 7 days
Há uma pegadinha. Você não pode encadear métodos ao criar um Período . Os seguintes código parece ser equivalente ao exemplo everyYearAndAWeek , mas não é. Apenas o último método é usado porque os métodos Period .ofXXX são métodos estáticos.
Period wrong = Period.ofYears(1).ofWeeks(1); // every week
Este código complicado é realmente como escrever o seguinte:
Period wrong = Period.ofYears(1);
wrong = Period.ofWeeks(7);
Isto claramente não é o que você pretendia! É por isso que o método of () nos permite passar o número de anos, meses e dias. Eles estão todos incluídos no mesmo período. Você irá obter um aviso do compilador sobre isso. Os avisos do compilador informam que algo está errado ou suspeito sem falhar a compilação.
Você provavelmente já percebeu que um Período é um dia ou mais de tempo. Há também Duração , que é destinada a unidades de tempo menores. Para Duração , você pode especificar o número de dias, horas, minutos, segundos ou nanossegundos. E sim, você poderia passar 365 dias para fazer um ano, mas você realmente não deveria - é para isso que o Period serve. Duração não é no exame, uma vez que, aproximadamente, funciona da mesma forma que o Período . É bom saber que existe Apesar.
A última coisa a saber sobre o Período é com quais objetos ele pode ser usado. Vamos olhar para algum código:
3: LocalDate date = LocalDate.of(2015, 1, 20);
4: LocalTime time = LocalTime.of(6, 15);
5: LocalDateTime dateTime = LocalDateTime.of(date, time);
6: Period period = Period.ofMonths(1);
7: System.out.println(date.plus(period)); // 2015-02-20
8: System.out.println(dateTime.plus(period)); // 2015-02-20T06:15
9: System.out.println(time.plus(period)); // UnsupportedTemporalTypeException
As linhas 7 e 8 funcionam como esperado. Eles adicionam um mês a 20 de janeiro de 2015, dando-nos 20 de fevereiro de 2015. O primeiro tem apenas a data e o segundo tem a data e a hora. A linha 9 tenta adicionar um mês a um objeto que tenha apenas um tempo. Isso não vai funcionar. Java lança uma exceção e reclama que tentamos usar uma unidade não suportada: Meses .Como você pode ver, você terá que prestar atenção ao tipo de data e hora de cada objeto coloque você os vê.