Содержание
Подсказки по использованию дат для Java
Категория | Описание | Классы |
---|---|---|
Локальные даты и время | Представляет локальный часовой пояс | java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime |
Зональные даты и время | Эти даты и время включают информацию о часовом поясе | java.time.ZonedDateTime, java.time.OffsetDateTime |
Форматы для дат и времени | Для разбора и печати дат и времени с шаблонами и в различных стилях | java.time.format.DateTimeFormatter |
Корректировка дат и времени | Для корректировки и манипулирования датами и временем с помощью удобных инкрементов | java.time.temporal.TemporalAdjusters, java.time.temporal.ChronoUnit |
Периоды, длительности и мгновения | Чтобы представить количество времени, периоды для дней или более длинных периодов и длительности для более коротких периодов, таких как минуты или секунды, в виде определенного момента времени | java.time.Periods, java.time.Durations, java.time.Instants |
- необходимо избегать использования java.util.Date, java.util.Calendar, java.text.DateFormat. Они считаются устаревшими.
Классы java.time.* для дат и времени
- использует статический метод LocalDate.now() для получения текущей даты;
- использует статический метод LocalTime.now() для получения текущего времени;
- использует статический метод LocalDate.of() для создания DateTime;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class InstanciandoDatas {
public static void main(String[] args) {
LocalDate data = LocalDate.now();
LocalTime horario = LocalTime.now();
LocalDateTime dataHora = LocalDateTime.of(data, horario);
System.out.println("Data e hora usando LocalDateTime.of(data, horario): " + dataHora);
dataHora = LocalDateTime.now();
System.out.println("Data e hora usando LocalDateTime.now(): " + dataHora);
}
}
Data e hora usando LocalDateTime.of(data, horario): 2022-05-04T18:32:49.130299600
Data e hora usando LocalDateTime.now(): 2022-05-04T18:32:49.132294300
- для генерации пользовательских дат и времени:
- LocalDate.of(YYYY, MM, DD)
- LocalDate.parse(«YYYY-MM-DD»)
- LocalTime.of(hh, mm, ss)
- LocalDate.parse(«чч:мм:сс»)
- LocalDateTime.of(YYYY, MM, DD, hh, mm, ss)
- LocalDate.parse(«YYYY-MM-DDThh:mm:ss»)
import java.time.LocalDate;
import java.time.LocalTime;
public class DatasCustomizadas {
public static void main(String[] args) {
LocalDate dataInicio = LocalDate.of(2022, 01, 01);
LocalDate dataFim = LocalDate.parse("2022-01-30");
System.out.println("Ferias de " + dataInicio + " ate " + dataFim);
LocalTime horaInicio = LocalTime.of(8,15,30);
LocalTime horaFim = LocalTime.parse("09:47:55");
System.out.println("Intervalo de " + horaInicio + " ate " + horaFim);
LocalDateTime dataHoraInicio = LocalDateTime.of(2022, 12,15, 1, 22, 43);
LocalDateTime dataHoraFim = LocalDateTime.parse("2022-12-20T05:45:43");
System.out.println("Recesso de " + dataHoraInicio + " ate " + dataHoraFim); }
}
Ferias de 2022-01-01 ate 2022-01-30
Intervalo de 08:15:30 ate 09:47:55
Recesso de 2022-12-15T01:22:43 ate 2022-12-20T05:45:43
- мы можем использовать DateTimeFormatter в качестве форматера времени даты для чтения строки или для генерации строки из времени даты.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class FormatandoDatas {
public static void main(String[] args) {
String strDataFormatoBR = "25-06-1980 11:15";
DateTimeFormatter formatoData = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime dataHoraBR = LocalDateTime.parse(strDataFormatoBR, formatoData);
System.out.println("Data e hora extraidos do formato BR: " + dataHoraBR);
DateTimeFormatter outroFormato = DateTimeFormatter.ofPattern("dd MM yy - HH, mm");
System.out.println("Outros formatos: " + dataHoraBR.format(outroFormato));
}
}
Data e hora extraidos do formato BR: 1980-06-25T11:15
Outros formatos: 25 06 80 - 11, 15
- LocalDateTime имеет несколько методов, которые позволяют легко прибавлять и вычитать из дат и времени. Например, .plusHours(), .plusDays(), .plusMinutes(), plusYears(), minusWeeks(), minusSeconds() и т.д.
- А также такие полезные методы, как .getDayOfWeek().
import java.time.LocalDate;
public class ManipulandoDatas {
public static void main(String[] args) {
LocalDate dataNascimento = LocalDate.of(1980, 6, 25);
System.out.println("Dia da Semana: " + dataNascimento.getDayOfWeek());
System.out.println("Três dias antes: " + dataNascimento.minusDays(3));
System.out.println("Três dias depois: " + dataNascimento.plusDays(3));
}
}
Dia da Semana: WEDNESDAY
Três dias antes: 1980-06-22
Três dias depois: 1980-06-28
Даты и время в зонах
- Все часовые пояса основаны на среднем времени по Гринвичу (GMT);
- Стандарт времени, использующий GMT в качестве основы для всех остальных часовых поясов, называется Всемирное координированное время (UTC);
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DataComFuso {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, ZoneId.of("America/Sao_Paulo"));
ZonedDateTime zonedDateTimeAC = ZonedDateTime.of(dateTime, ZoneId.of("Brazil/Acre"));
ZonedDateTime zonedDateTimePT = ZonedDateTime.of(dateTime, ZoneId.of("Europe/Lisbon"));
System.out.println("Data hora fuso SP: " + zonedDateTimeSP);
System.out.println("Data hora fuso AC: " + zonedDateTimeAC);
System.out.println("Data hora fuso PT: " + zonedDateTimePT);
}
}
Data hora fuso SP: 2022-05-05T00:34:41.243321900-03:00[America/Sao_Paulo]
Data hora fuso AC: 2022-05-05T00:34:41.243321900-05:00[Brazil/Acre]
Data hora fuso PT: 2022-05-05T00:34:41.243321900+01:00[Europe/Lisbon]
- Названия зон не указаны на странице документации для ZoneId, но вы можете воспользоваться этой ссылкой.
- Вы можете узнать, перешли ли вы на летнее время, используя ZoneRules.
- .isDaylightSavings(), используя Instant
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class HorarioDeVerao {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.parse("2018-05-01T05:00:00");
ZoneId zoneId = ZoneId.of("America/Sao_Paulo");
ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, zoneId);
boolean isDaylightSaving = zoneId.getRules().isDaylightSavings(zonedDateTimeSP.toInstant());
System.out.println("Em " + zonedDateTimeSP + " SP esta em horario de verao: " + isDaylightSaving);
dateTime = LocalDateTime.parse("2018-12-01T05:00:00");
zonedDateTimeSP = ZonedDateTime.of(dateTime, zoneId);
isDaylightSaving = zoneId.getRules().isDaylightSavings(zonedDateTimeSP.toInstant());
System.out.println("Em " + zonedDateTimeSP + " SP esta em horario de verao: " + isDaylightSaving);
}
}
Корректировки даты и времени
- объекты datetime как «неизменяемые».
- можно использовать корректировщики, например TemporalAdjusters, в datetime для создания новых.
- firstDayOfNextYear()
- lastDayOfMonth()
- withHour()
- withYear()
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;
public class AjustandoDatas {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.parse("2018-05-01T05:00:00");
ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, ZoneId.of("America/Sao_Paulo"));
System.out.println("O dia " + zonedDateTimeSP + " foi no dia da semana: " + zonedDateTimeSP.getDayOfWeek());
ZonedDateTime nextFridayDateTime = zonedDateTimeSP.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println("A data da proxima SEXTA foi: " + nextFridayDateTime);
}
}
O dia 2018-05-01T05:00-03:00[America/Sao_Paulo] foi no dia da semana: TUESDAY
A data da proxima SEXTA foi: 2018-05-04T05:00-03:00[America/Sao_Paulo]
- когда нам не нужно изменять дату с учетом правил зоны, мы должны использовать OffsetDateTime
Периоды, длительности и мгновения
- Периоды представляют собой период в несколько дней, месяцев или лет;
- Длительность представляет короткий период в минутах или часах.
- Instant представляет собой промежуток времени.
- количество секунд (и наносекунд) с 1 января 1970 года.
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class UsandoPeriodosDeTempo {
public static void main(String[] args) {
ZonedDateTime startDateTime = ZonedDateTime.of(2022, 4, 8, 13, 35, 56, 0, ZoneId.of("America/Sao_Paulo"));
Period period = Period.ofMonths(3);
ZonedDateTime endDateTime = startDateTime.plus(period);
System.out.println("Inicio da Atividade: " + startDateTime);
System.out.println("Fim da Atividade (+ 3 meses): " + endDateTime);
System.out.println("nFim da Atividade com horario de Portugal: " + endDateTime.withZoneSameInstant(ZoneId.of("Europe/Lisbon")));
}
}
Inicio da Atividade: 2022-04-08T13:35:56-03:00[America/Sao_Paulo]
Fim da Atividade (+ 3 meses): 2022-07-08T13:35:56-03:00[America/Sao_Paulo]
Fim da Atividade com horario de Portugal: 2022-07-08T17:35:56+01:00[Europe/Lisbon]
import java.time.Duration;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
public class DuracaoDeIntervalo {
public static void main(String[] args) {
LocalTime begins = LocalTime.of(12, 07, 10);
LocalTime ends = LocalTime.of(14, 22, 37);
System.out.println("Intervalo: " + begins + " - " + ends);
long minutes = ChronoUnit.MINUTES.between(begins, ends);
System.out.println("Total minutos: " + begins + " - " + ends);
Duration duration = Duration.ofMinutes(minutes);
System.out.println("Duracao do intervalo: " + duration);
}
}
Intervalo: 12:07:10 - 14:22:37
Total minutos: 12:07:10 - 14:22:37
Duracao do intervalo: PT2H15M
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class UsandoInstant {
public static void main(String[] args) {
ZonedDateTime eventDateTime = ZonedDateTime.of(1998, 1, 13, 16, 45, 56, 0, ZoneId.of("America/Sao_Paulo"));
Instant eventInstant = eventDateTime.toInstant();
System.out.println("Data e hora do evento: " + eventDateTime);
System.out.println("Instante do evento: " + eventInstant);
System.out.println("nNumero de segundos de 01-Janeiro-1970 ate o inicio do evento: " + eventInstant.getEpochSecond());
}
}
Data e hora do evento: 1998-01-13T16:45:56-02:00[America/Sao_Paulo]
Instante do evento: 1998-01-13T18:45:56Z
Numero de segundos de 01-Janeiro-1970 ate o inicio do evento: 884717156
Использование дат и времени с локалями
- Класс DateTimeFormatter может использовать экземпляр Locale для настройки форматирования вывода для определенной локали.
- API говорит, что локаль — это «определенный географический, политический или культурный регион».
Locale(String language)
Locale(String language, String country)
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
public class UsandoLocale {
public static void main(String[] args) {
Locale locBR = new Locale("pt", "BR");
Locale locJA = new Locale("ja");
Locale locUS = new Locale("US");
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("Formato longo: ");
System.out.println("Brasil: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(locBR)));
System.out.println("Japao: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(locJA)));
System.out.println("USA: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(locUS)));
System.out.println("nFormato curto: ");
System.out.println("Brasil: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(locBR)));
System.out.println("Japao: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(locJA)));
System.out.println("USA: " +
zonedDateTime.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(locUS)));
}
}
Formato longo:
Brasil: 5 de maio de 2022 13:14:16 CEST
Japao: 2022年5月5日 13:14:16 CEST
USA: 2022 May 5 13:14:16 CEST
Formato curto:
Brasil: 05/05/2022 13:14
Japao: 2022/05/05 13:14
USA: 2022-05-05 13:14
РЕЗЮМЕ
- основные методы
java.time Класс | пример метода |
---|---|
LocalDate | LocalDate.now(); LocalDate.of(2022, 8, 22); LocalDate.parse(«2022-8-22»); |
LocalTime | LocalTime.now(); LocalTime.of(11, 20, 37); LocalTime.of(«11:20:37»); |
LocalDateTime | LocalDateTime.now(); LocalDateTime.of(aDate, aTime); LocalDateTime.parse(«2022-05-09T11:20:37»); LocalDateTime.parse(aDateTime, aFormatter); LocalDateTime.parse(«2022-09-22T11:20», aFormatter); |
ZonedDateTime | ZonedDateTime.now(); ZonedDateTime.of(aDateTime, ZoneId.of(aZoneString)); ZonedDateTime.parse(«2018-05-09T11:20:47-03:00») |
OffsetDateTime | OffsetDateTime.now(); OffsetDateTime.of(aDateTime, ZoneOffset.of(«-03:00»)); OffsetDateTime.parse(«2018-04-08T11:19:36-03:00»); |
format.DateTimeFormatter | DateTimeFormatter.ofPattern(«yyyy-MM-dd HH:mm»); DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(aLocale); |
Мгновение | Instant.now() zonedDateTime.toInstant(); aDateTime.toInstant(ZoneOffset.of(«+5»)); |
Duration | Duration.between(aDate1, aDate2); Duration.ofMinutes(5); |
Период | Период.между(aDate1, aDate2); Period.ofDays(3); |
util.Locale | Locale.getDefault(); new Locale(String language); new Locale(String language, String country); |
java.time Класс | пример настройки |
---|---|
LocalDate | aDate.minusDays(3); aDate.plusWeeks(1); aDate.withYear(2018); |
LocalTime | aTime.minus(3, ChronoUnit.MINUTES); aTime.plusMinutes(3); aTime.withHour(12); |
LocalDateTime | aDateTime.minusDays(3); aDateTime.plusMinutes(10); aDateTime.plus(Duration.ofMinutes(5)); aDateTime.withMonth(2); |
ZonedDateTime | zonedDateTime.withZoneSameInstant(ZoneId.of(«US/Pacific»)); |
ССЫЛКИ
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html
https://mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset/
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/package-summary.html