Работа с датами — Java 8+


Подсказки по использованию дат для 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

Оцените статью
Procodings.ru
Добавить комментарий