Основы: API обработки данных JDK8 — необходимо знать

Java
Основы: API обработки данных JDK8 — необходимо знать

предисловие

До jdk8 мы использовали Date, Calender и SimpleDateFormat, но его API недостаточно мощный, и есть проблемы с безопасностью потоков, которые подвергались критике. jdk8 предоставляет новый API времени. Классы в пакете java.time неизменяемы и потокобезопасны. Он реализован тем же автором, что и Joda, поэтому использует многие функции Joda. Если вы привыкли к Joda, он может очень удобно переключаться на использование классов java.time

Следите за официальной учетной записью, общайтесь друг с другом и ищите в WeChat: Sneak forward

Краткое введение в классы java.time

  • Чтобы различать дату и время, единицей даты (даты) является год, месяц и день. Единица времени - часы, минуты и секунды
своего рода описывать
Мгновенное Отметка времени (мгновенное время, с часовым поясом)
Местная Дата Дата (например: 2018-09-24, без часового пояса)
Местное время Время (например: 10:32:10, без часового пояса)
Местная ДатаВремя Дата и время (например: 2018-09-24 10:32:10, без часового пояса)
Продолжительность Разница между двумя временами с точностью до секунд или наносекунд
Пероид Разница между двумя датами (с точностью до дня)
ДатаВремяФорматтер средство форматирования даты и времени
идентификатор зоны . Часовой пояс
ZoneOffset Смещение часового пояса (например: +8:00)
ЗонедДатеВремя дата и время с часовым поясом
ChronoUnit Класс перечисления даты (доступен в операциях сложения и вычитания времени)
День месяца День месяца
Год месяц год месяц

Часы

  • Часы — это часы, связанные с часовым поясом.Часы могут получать метку времени и часовой пояс ZoneId вместо System.currentTimeMillis() и TimeZone.getDefault(). Это абстрактный класс с четырьмя подклассами.

public static Clock systemDefaultZone()
public static Clock offset(Clock baseClock, Duration offsetDuration)
public static Clock tick(Clock baseClock, Duration tickDuration)
public static Clock fixed(Instant fixedInstant, ZoneId zone) 
--------下面方法由上面四个子类实现---------
//获取时区
public abstract ZoneId getZone()
//指定时区
public abstract Clock withZone(ZoneId zone)
//获取时间戳
public abstract Instant instant()
  • Системные локальные часы по умолчанию SystemClock
Clock clock = Clock.systemDefaultZone();
System.out.println(clock.getZone());
Instant instant = clock.instant();
System.out.println(instant);
----------输出结果-----------
Asia/Shanghai
2021-01-03T05:05:31.791Z
1609650331791
  • OffsetClock OffsetClock
Clock clock = Clock.systemDefaultZone();
Clock pastClock = Clock.offset(clock, Duration.ofMillis(-10000));
System.out.println(pastClock.getZone());
//当前时间和过去pastClock相差10000毫秒
System.out.println(clock.millis() - pastClock.millis());
----------输出结果-----------
10000
  • TickDuration периодического времени, время перехвата до ближайшего предыдущего цикла или времени следующего цикла. Примечание. TickDuration не будет использовать текущий момент времени в качестве времени начала цикла.
Clock clock = Clock.systemDefaultZone();
Clock nearestHourClock = Clock.tick(clock, Duration.ofMillis(10));
//当前时间是2021-01-03T05:36:54.088Z,周期是10毫秒,TickDuration自动
//选择2021-01-03T05:36:54.090Z作为起始时间
System.out.println(clock.instant());
System.out.println(nearestHourClock.instant());
Thread.sleep(10);
System.out.println(clock.instant());
System.out.println(nearestHourClock.instant());
----------输出结果-----------
2021-01-03T05:43:19.088Z
2021-01-03T05:43:19.090Z
2021-01-03T05:43:19.107Z
2021-01-03T05:43:19.100Z
  • FixedInstant с постоянным временем
Clock clock = Clock.systemDefaultZone();
Clock fixedClock = Clock.fixed(clock.instant(), ZoneId.systemDefault());
System.out.println(fixedClock.instant());
Thread.sleep(1000);
System.out.println(fixedClock.instant());
----------输出结果-----------
2021-01-03T05:27:43.272Z
2021-01-03T05:27:43.272Z

Temporal

  • Унифицированный интерфейс класса времени определяет некоторые общие операции метода, такие как: сложение и вычитание определенной единицы времени, установка временной области на определенное фиксированное значение
public interface Temporal extends TemporalAccessor {
    //获取时间类能表示的TemporalField范围值
    public ValueRange range(TemporalField field)
    //设置TemporalField时间域的值
    public Temporal with(TemporalField field, long newValue)
    //根据TemporalAdjuster接口转化时间
    public Temporal with(TemporalAdjuster adjuster)
    //增加指定TemporalUnit单位的数量
    public Temporal plus(long amountToAdd, TemporalUnit unit)
    //减少指定TemporalUnit单位的数量
    public Temporal minus(long amountToSubtract, TemporalUnit unit)
  • Подкласс темпорального

Instant

  • Instant используется для управления отметками времени с часовым поясом, часовым поясом UTC по Гринвичу по умолчанию. Поэтому вам необходимо указать свой собственный часовой пояс при переносе других классов времени в Instant.
public static Instant now()
public static Instant now(Clock clock)
//根据毫秒生成Instant
public static Instant ofEpochMilli(long epochMilli)
//根据秒生成Instant,外附加纳秒单位的数值
public static Instant ofEpochSecond(long epochSecond, long nanoAdjustment)
//text的格式:2021-01-04T06:37:53.743Z
public static Instant parse(CharSequence text) 
//计算与Temporal相隔的时间差,以TemporalUnit为单位度量
public long until(Temporal endExclusive, TemporalUnit unit) 
  • Создание метки времени
Instant instant = Instant.now();
System.out.println(instant);
instant = Instant.now(Clock.systemDefaultZone());
System.out.println(instant);
//和Date的相互转换
instant = Instant.ofEpochMilli(new Date().getTime());
System.out.println(instant);
//根据字符串生成时间,支持到纳秒级别
instant = Instant.parse("1995-10-23T10:12:35.999999999Z");
System.out.println(instant);
//根据秒和偏差的纳秒 创建时间戳
Instant preInstant = Instant.ofEpochSecond(1609741558,1);
//过去时间和当前时间的相差值,可以指定单位TemporalUnit
System.out.println(preInstant.until(Instant.now(), ChronoUnit.MINUTES));
---------------输出结果------------------------
2021-01-04T06:37:53.743Z
2021-01-04T06:37:53.795Z
2021-01-04T06:37:53.795Z
1995-10-23T10:12:35.999999999Z
2021-01-04T06:25:58.000000001Z
2021-01-04T06:37:53.798Z
11
  • Использование мгновенного
Instant instant = Instant.now();
//设置时区为America/El_Salvador(美国)
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("America/El_Salvador"));
System.out.println(zonedDateTime);
//设置时区为偏移-6的时区(美国)
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(-6));
System.out.println(offsetDateTime);
//天数加2,分钟数减1。月数设定为12月
Instant fixInstant = instant.minus(1, ChronoUnit.MINUTES)
        .plus(2, ChronoUnit.DAYS);
System.out.println(instant);
System.out.println(fixInstant);
---------------输出结果-----------------
2021-01-04T00:53:01.895-06:00[America/El_Salvador]
2021-01-04T00:53:01.895-06:00
2021-01-04T06:53:01.895Z
2021-01-06T06:52:01.895Z

LocalTime

  • LocalTime — это класс, используемый для работы с часами, минутами и секундами, плюс он точен до уровня наносекунд; здесь нет концепции часового пояса, и вам нужно сначала установить часовой пояс для перехода в Instant
  • Конструктор LocalTime
public static LocalTime now() 
public static LocalTime of(int hour, int minute, int second, int nanoOfSecond)
//距离凌晨的秒数
public static LocalTime ofSecondOfDay(long secondOfDay)
//距离凌晨的纳秒数
public static LocalTime ofNanoOfDay(long nanoOfDay)
public static LocalTime parse(CharSequence text, DateTimeFormatter formatter) 
//jdk9
public static LocalTime ofInstant(Instant instant, ZoneId zone)
  • Преобразование между LocalTime и другими классами времени
public LocalDateTime atDate(LocalDate date)
public OffsetTime atOffset(ZoneOffset offset) 
public long toEpochSecond(LocalDate date, ZoneOffset offset)
  • Пример создания LocalTime
//  1的单位是纳秒
LocalTime localTime = LocalTime.of(12, 12, 12, 1);
System.out.println(localTime);
localTime = LocalTime.ofSecondOfDay(60 * 60 * 12 + 60 * 12);
System.out.println(localTime);
localTime = LocalTime.parse("12:12:12", DateTimeFormatter.ISO_TIME);
System.out.println(localTime);
---------------输出结果-----------------
12:12:12.000000001
12:12
12:12:12
  • Общие методы обработки LocalTime
LocalTime localTime = LocalTime.of(12, 12, 12, 1);
System.out.println(localTime);
//拼接日期,生成日期时间
LocalDateTime dateTime = localTime.atDate(LocalDate.now());
System.out.println(dateTime);
//设定时区,时间量不变
OffsetTime offsetTime = LocalTime.now().atOffset(ZoneOffset.ofHours(-6));
System.out.println(offsetTime);
//当前时间加日期,并设置时区为offset
long seconds = LocalTime.now().toEpochSecond(LocalDate.now(), ZoneOffset.ofHours(-6));
System.out.println(seconds);
---------------输出结果-----------------
12:12:12.000000001
2021-01-04T12:12:12.000000001
16:29:33.917387700-06:00
1609799373

LocalDate

  • LocalDate — это класс, используемый для управления годом, месяцем и днем; представленная единица времени — это конец дня, за исключением часов и последующих единиц.
public static LocalDate now()
public static LocalDate of(int year, int month, int dayOfMonth)
public static LocalDate ofInstant(Instant instant, ZoneId zone)
//当天是当月的第几天
public int getDayOfMonth()
//当天是当年的第几天
public int getDayOfYear()
//当天是当周的第几天(1~7)
public DayOfWeek getDayOfWeek() 
//是否闰年
public boolean isLeapYear() 
public LocalDateTime atTime(LocalTime time)
//设置时间为今天的凌晨
public LocalDateTime atStartOfDay()
//以下两个方法是jdk9,获取当前时间到endExclusive的每一个日期
public Stream<LocalDate> datesUntil(LocalDate endExclusive)
public Stream<LocalDate> datesUntil(LocalDate endExclusive, Period step) 
  • Пример создания LocalDate
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
localDate = LocalDate.of(2020,3,19);
System.out.println(localDate);
localDate = LocalDate.parse("20210319", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(localDate);
---------------输出结果-----------------
2021-01-04
2020-03-19
2021-03-19
  • Операции с LocalDate
LocalDate localDate = LocalDate.parse("20210319", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println("当前年的第几天:" + localDate.getDayOfYear() + "; 当前月的第几天" + localDate.getDayOfMonth()+"; 当前星期几:"+localDate.getDayOfWeek());
//加LocalTime转变为LocalDateTime
LocalDateTime dateTime = localDate.atTime(LocalTime.now());
System.out.println(dateTime);
---------------输出结果-----------------
当前年的第几天:78; 当前月的第几天19; 当前星期几:FRIDAY
2021-03-19T15:37:54.713

LocalDateTime

  • Эквивалентен комбинации LocalDate и LocalTime, классу, используемому для представления года, месяца, дня, часа, минуты и секунды, плюс точность до наносекундного уровня; нет концепции часового пояса, вам нужно сначала установить часовой пояс для передачи в Мгновенное
public static LocalDateTime now()
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
public static LocalDateTime of(LocalDate date, LocalTime time) 
public static LocalDateTime ofInstant(Instant instant, ZoneId zone)
//设置偏移时区
public OffsetDateTime atOffset(ZoneOffset offset) 
//设置时区,ZonedDateTime会根据夏令时调的,纯粹是配合美国政策的东西
public ZonedDateTime atZone(ZoneId zone) 
//截取时间到TemporalUnit单位
public Instant truncatedTo(TemporalUnit unit)
default Instant toInstant(ZoneOffset offset) 
default long toEpochSecond(ZoneOffset offset) 
  • Пример построения LocalDateTime
LocalDateTime dateTime = LocalDateTime.of(2021,3,19,12,12,12,01);
System.out.println(dateTime);
dateTime = LocalDateTime.of(LocalDate.now(), LocalTime.now());
System.out.println(dateTime);
dateTime = LocalDateTime.parse("2021-03-19 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateTime);
---------------输出结果-----------------
2021-03-19T12:12:12.000000001
2021-01-04T16:36:40.193887
2021-03-19T12:12:12
  • Пример операции LocalDateTime
LocalDateTime dateTime = LocalDateTime.now();
//设置偏移时区为-6
OffsetDateTime offsetDateTime = dateTime.atOffset(ZoneOffset.ofHours(-6));
System.out.println(offsetDateTime);
//设置时区为美国时区
ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.of("America/El_Salvador"));
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.toEpochSecond());
//输出LocalDateTime的时间戳,因为LocalDateTime是不带时区的,需要指定时区
System.out.println(dateTime.toEpochSecond(ZoneOffset.ofHours(0)));

Период и продолжительность

  • Промежуток времени для операции «Период»: год, месяц, день.
public static Period of(int years, int months, int days)
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)
//获取当前Period实例的单位
public List<TemporalUnit> getUnits()
//获取TemporalUnit的数量
public long get(TemporalUnit unit)
public int getYears() 
public int getMonths() 
public int getDays() 
  • Промежуток времени операции Duration составляет часы, минуты и секунды плюс наносекунды.
//间隔days天的时间差(单位秒)
public static Duration ofDays(long days)
//间隔hours小时的时间差(单位秒)
public static Duration ofHours(long hours)
public static Duration ofSeconds(long seconds, long nanoAdjustment)
public static Duration parse(CharSequence text) 
public static Duration between(Temporal startInclusive, Temporal endExclusive)
public List<TemporalUnit> getUnits()
//时间差的间隔天数,天数单位部分,没有则是0
public long toDaysPart()
//时间差的小时跨度数,小时单位部分,没有则是0
public int toHoursPart()
//时间差的分钟跨度数,分钟单位部分,没有则是0
public int toMinutesPart()
//时间差的秒跨度数,秒单位分,没有则是0
public int toSecondsPart()
  • Пример использования
Duration duration = Duration.ofHours(1+24);
System.out.println("相隔天数:"+duration.toDaysPart());
System.out.println("外加"+duration.toHoursPart()+"小时");
---------------输出结果-----------------
相隔天数:1
外加1小时

DateTimeFormatter

//构造指定模式的时间格式类
public static DateTimeFormatter ofPattern(String pattern)
//构造指定模式的时间格式类,并指定Locale
public static DateTimeFormatter ofPattern(String pattern, Locale locale)
public DateTimeFormatter withLocale(Locale locale) 
//解析出来的时间是带时区的
public DateTimeFormatter withZone(ZoneId zone)
//获取当前时区
public ZoneId getZone() 
public String format(TemporalAccessor temporal)
//解析字符串为TemporalAccessor
public TemporalAccessor parse(CharSequence text) 
  • Пример использования
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
dateTimeFormatter = dateTimeFormatter.withZone(ZoneId.of("America/El_Salvador"));
System.out.println(dateTimeFormatter.parse("2021-03-19 12:12:12"));
System.out.println(dateTimeFormatter.parse("2021-03-19 12:12:12").getLong(ChronoField.INSTANT_SECONDS));
---------------输出结果-----------------
{InstantSeconds=1616177532},ISO,America/El_Salvador resolved to 2021-03-19T12:12:12
1616177532

ZoneId и ZoneOffset

  • ZoneId представляет часовой пояс с поправкой на летнее время. В разные годы ZonedDateTime, соответствующий ZoneId, будет меняться.
public static ZoneId systemDefault()
//获取jdk支持的ZoneId的集合
public static Set<String> getAvailableZoneIds()
public static ZoneId of(String zoneId)
//根据一个TemporalAccessor的实体获取,如:ZonedDateTime
public static ZoneId from(TemporalAccessor temporal)
  • ZoneOffset также представляет часовой пояс, смещение фиксированного времени. Не настраивается на летнее время, исправлено
public static ZoneOffset of(String offsetId)
public static ZoneOffset ofHours(int hours) 
public static ZoneOffset ofHoursMinutesSeconds(int hours, int minutes, int seconds)

ZonedDateTime и OffsetDateTime

  • ZonedDateTime, соответствующий комбинации ZoneId и LocalDateTime.
public static ZonedDateTime now()
public static ZonedDateTime ofInstant(Instant instant, ZoneId zone)
public static ZonedDateTime ofInstant(LocalDateTime localDateTime, ZoneOffset offset, ZoneId zone)
public static ZonedDateTime parse(CharSequence text, DateTimeFormatter formatter) 
public LocalDateTime toLocalDateTime()
public LocalDate toLocalDate() 
//转化为OffsetDateTime(时区变成固定的,不再根据夏令时动态调整)
public OffsetDateTime toOffsetDateTime() 
  • OffsetDateTime, соответствующий комбинации ZoneOffset и LocalDateTime.
public static OffsetDateTime of(LocalDate date, LocalTime time, ZoneOffset offset) 
public static OffsetDateTime of(LocalDateTime dateTime, ZoneOffset offset) 
public static OffsetDateTime ofInstant(Instant instant, ZoneId zone) 
public static OffsetDateTime parse(CharSequence text, DateTimeFormatter formatter)
//当前时间转成offset时区表示的时间
public OffsetDateTime withOffsetSameInstant(ZoneOffset offset) 
  • Пример использования ZonedDateTime и OffsetDateTime
System.out.println(LocalDateTime.now());
//当前时间并转为America/Toronto时区的时间(带America/Toronto时区,会根据夏令时调整时间)
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(), ZoneId.of("America/Toronto"));
System.out.println(zonedDateTime);
//当前时间并转为+0时区的时间
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(Instant.now(), ZoneOffset.of("+0"));
System.out.println(offsetDateTime);
---------------输出结果---------------------
2021-01-10T15:07:08.072968
2021-01-10T02:07:08.073187-05:00[America/Toronto]
2021-01-10T07:07:08.075340Z

МесяцДень и ГодМесяц

  • Рабочий класс МесяцДень
public static MonthDay now()
public static MonthDay of(int month, int dayOfMonth)
public static MonthDay parse(CharSequence text, DateTimeFormatter formatter)
public LocalDate atYear(int year)
public Month getMonth()
//当前月的总天数
public int getDayOfMonth()
  • Класс операции ГодМесяц
public static YearMonth now()
public static YearMonth of(int year, int month) 
//根据一个时间获取YearMonth,如果LocalDate
public static YearMonth from(TemporalAccessor temporal)
//是否闰年
public boolean isLeapYear()
public Month getMonth()
public int getYear()
//当前年的总天数
public int lengthOfYear()
//此天数是否在这个月是有效的
public boolean isValidDay(int dayOfMonth)
public LocalDate atDay(int dayOfMonth)
  • Пример использования
MonthDay monthDay = MonthDay.of(3,19);
System.out.println(MonthDay.from(LocalDate.now()).isAfter(monthDay));
YearMonth yearMonth = YearMonth.of(2021,03);
System.out.println("2021 是否是闰年:"+yearMonth.isLeapYear());
------------输出结果--------------
false
2021 是否是闰年:false

ChronoUnit

  • Единица измерения времени, класс перечисления, наследует TemporalUnit. Он указывает, какая единица используется для измерения интервала времени. Например, интервал времени в два дня может быть представлен 48 часами. Обычно используется для установки определенной единицы времени, операций сложения и вычитания.
public enum ChronoUnit implements TemporalUnit {
    NANOS("Nanos", Duration.ofNanos(1)),
    MICROS("Micros", Duration.ofNanos(1000)),
    MILLIS("Millis", Duration.ofNanos(1000_000)),
    SECONDS("Seconds", Duration.ofSeconds(1)),
    MINUTES("Minutes", Duration.ofSeconds(60)),
    HOURS("Hours", Duration.ofSeconds(3600)),
    HALF_DAYS("HalfDays", Duration.ofSeconds(43200)),
    DAYS("Days", Duration.ofSeconds(86400)),
    WEEKS("Weeks", Duration.ofSeconds(7 * 86400L)),
    MONTHS("Months", Duration.ofSeconds(31556952L / 12)),
    YEARS("Years", Duration.ofSeconds(31556952L)),
    DECADES("Decades", Duration.ofSeconds(31556952L * 10L)),
    CENTURIES("Centuries", Duration.ofSeconds(31556952L * 100L)),
    MILLENNIA("Millennia", Duration.ofSeconds(31556952L * 1000L)),
    ERAS("Eras", Duration.ofSeconds(31556952L * 1000_000_000L)),
    FOREVER("Forever", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999));
	//ChronoUnit的定义
    private final String name;
    private final Duration duration;
    private ChronoUnit(String name, Duration estimatedDuration) {
        this.name = name;
        this.duration = estimatedDuration;
    }
}

ChronoField

  • Наследуйте TemporalField, класс перечисления. Подобно ChronoUnit, он реализован на основе TemporalUnit и обычно используется для получения значений в разных временных областях.
public enum ChronoField implements TemporalField {
    //一秒钟的纳秒数
    NANO_OF_SECOND("NanoOfSecond", NANOS, SECONDS, ValueRange.of(0, 999_999_999))
    //一分钟的秒数
    SECOND_OF_MINUTE("SecondOfMinute", SECONDS, MINUTES, ValueRange.of(0, 59), "second")
    //一个小时的分钟数
    MINUTE_OF_HOUR("MinuteOfHour", MINUTES, HOURS, ValueRange.of(0, 59), "minute")
    //一上午或者一下午有多少个小时
    CLOCK_HOUR_OF_AMPM("ClockHourOfAmPm", HOURS, HALF_DAYS, ValueRange.of(1, 12))
    //一天的小时数
    CLOCK_HOUR_OF_DAY("ClockHourOfDay", HOURS, DAYS, ValueRange.of(1, 24))
    //上午还是下午
    AMPM_OF_DAY("AmPmOfDay", HALF_DAYS, DAYS, ValueRange.of(0, 1), "dayperiod")
    //一周的第几天
    DAY_OF_WEEK("DayOfWeek", DAYS, WEEKS, ValueRange.of(1, 7), "weekday")
    //当前月的天数
    DAY_OF_MONTH("DayOfMonth", DAYS, MONTHS, ValueRange.of(1, 28, 31), "day")
    //当前年的天数
    DAY_OF_YEAR("DayOfYear", DAYS, YEARS, ValueRange.of(1, 365, 366))
    //当前月的周数
    ALIGNED_WEEK_OF_MONTH("AlignedWeekOfMonth", WEEKS, MONTHS, ValueRange.of(1, 4, 5))
    //当前年的周数
    ALIGNED_WEEK_OF_YEAR("AlignedWeekOfYear", WEEKS, YEARS, ValueRange.of(1, 53))
    //以每月的第一天为星期一,然后计算当天是一周的第几天
    ALIGNED_DAY_OF_WEEK_IN_MONTH("AlignedDayOfWeekInMonth", DAYS, WEEKS, ValueRange.of(1, 7))
    //以每月的第一天为星期一,然后计算当天是一周的第几天
    ALIGNED_DAY_OF_WEEK_IN_YEAR("AlignedDayOfWeekInYear", DAYS, WEEKS, ValueRange.of(1, 7))
    //当前年的月数
    MONTH_OF_YEAR("MonthOfYear", MONTHS, YEARS, ValueRange.of(1, 12), "month")
    private final TemporalUnit baseUnit;
    private final String name;
    private final TemporalUnit rangeUnit;
    private final ValueRange range;
    private final String displayNameKey;
    private ChronoField(String name, TemporalUnit baseUnit, TemporalUnit rangeUnit, ValueRange range) {
        this.name = name;
        this.baseUnit = baseUnit;
        this.rangeUnit = rangeUnit;
        this.range = range;
        this.displayNameKey = null;
    }
  • Пример использования ALIGNED_WEEK_OF_MONTH и ALIGNED_DAY_OF_WEEK_IN_MONTH
//以1号为周一,每七天一周,10号就是一周的第三天
int num = LocalDateTime.now().get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);
System.out.println(num);
//这个月的第二周
num = LocalDateTime.now().get(ChronoField.ALIGNED_WEEK_OF_MONTH);
System.out.println(num);
------------输出结果--------------
3
2

Интерфейс настройки преобразования времени: TemporalAdjuster

  • Поскольку классы времени java.time неизменяемы, когда вам нужно настроить время, вы можете вызвать этот метод для достижения
  • jdk предоставляет класс инструментов TemporalAdjusters для некоторых методов настройки по умолчанию.
//由子类实现
Temporal adjustInto(Temporal temporal)

TemporalAdjusters

  • инструмент для корректировки времени
//设置天单位度量数为年的第一天
public static TemporalAdjuster firstDayOfYear()
//设置天单位度量数为年的最后一天
public static TemporalAdjuster lastDayOfYear()
//设置时间为下一年的第一天
public static TemporalAdjuster firstDayOfNextYear() 
//设置时间为当月的第一天
public static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)
//设置时间为当月的最后一天
public static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)
//设置时间为当月第ordinal个周的星期几-dayOfWeek
public static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
//设置时间为下周星期几
public static TemporalAdjuster next(DayOfWeek dayOfWeek) 
//设置时间为上周星期几
public static TemporalAdjuster previous(DayOfWeek dayOfWeek)
//如果当前星期数和dayOfWeek不一样,则设置时间为上周的星期几-dayOfWeek
public static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek) 
  • Пример
LocalDateTime dateTime = LocalDateTime.now();
//设置天区域的值为当前月的第一天,其他域的值不变(现在时间是202101)
dateTime = dateTime.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(dateTime);
------------输出结果--------------
2021-01-01T14:50:40.659823

Преобразование даты и LocalDateTime

  • Класс времени, использовавшийся до JDK1.8, — Date.Для совместимости нам нужно понять преобразование между Date и LocalDateTime.
  • Пример
//Date转LocalDateTime
Date date = new Date();
LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println(dateTime);
dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
System.out.println(dateTime);
------------输出结果------------
2021-01-10T14:25:08.649
2021-01-10T14:25:08.649
//LocalDateTime转Date
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println(date);
------------输出结果------------
Sun Jan 10 14:29:04 CST 2021

Добро пожаловать на ошибку в тексте

Справочная статья