建立一个LocalDate对象并读取其值java
// 根据年月日建立日期 LocalDate date1 = LocalDate.of(2014, 3, 18); // 读取 System.out.println(date1.getYear()); // 2014 System.out.println(date1.getMonth()); // MARCH System.out.println(date1.getMonth().getValue()); // 3 System.out.println(date1.getDayOfMonth()); // 18 System.out.println(date1.lengthOfMonth()); // 31 System.out.println(date1.isLeapYear()); // false // 当前日期 LocalDate now = LocalDate.now(); System.out.println(now); // 2018-08-14 // 从日期对象中获取年月日 System.out.println(now.get(ChronoField.YEAR)); // 2018 System.out.println(now.get(ChronoField.MONTH_OF_YEAR)); // 8 System.out.println(now.get(ChronoField.DAY_OF_MONTH)); // 14
建立LocalTime并读取值ide
// 根据时分秒建立时间 LocalTime time1 = LocalTime.of(13, 45, 20); System.out.println(time1.getHour()); // 13 System.out.println(time1.getMinute()); // 45 System.out.println(time1.getSecond()); // 20 // 经过日期或时间字符串建立日期或时间 LocalDate date2 = LocalDate.parse("2014-03-18"); LocalTime time2 = LocalTime.parse("13:45:20");
直接建立LocalDateTime对象或经过合并日期和时间的方式建立code
// 直接建立日期时间 LocalDateTime lt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); // 经过日期和时间建立 LocalDate date1 = LocalDate.of(2014, 3, 18); LocalTime time1 = LocalTime.of(13, 45, 20); LocalDateTime lt2 = LocalDateTime.of(date1, time1); LocalDateTime lt3 = date1.atTime(13, 45, 20); LocalDateTime lt4 = date1.atTime(time1); LocalDateTime lt5 = time1.atDate(date1); // 从日期时间中提取日期和时间 LocalDate date2 = lt1.toLocalDate(); LocalTime time2 = lt1.toLocalTime();
机器的日期和时间格式orm
// 获取当前时刻时间戳 System.out.println(Instant.now().toEpochMilli()); // 1534255959679
Druation时间间隔单位是时分秒,Period时间间隔单位年月日对象
建立Duration和Period对象接口
LocalDate date1 = LocalDate.parse("2018-08-12"); LocalDate date2 = LocalDate.parse("2018-08-11"); LocalTime time1 = LocalTime.parse("12:45:20"); LocalTime time2 = LocalTime.parse("12:45:21"); Instant instant1 = Instant.ofEpochSecond(22); Instant instant2 = Instant.ofEpochSecond(11); // 时间间隔是时间秒 Duration d2 = Duration.between(time1, time2); // time2 - time1 Duration d3 = Duration.between(instant1, instant2); // instant2 - instant1 Duration d4 = Duration.ofMinutes(3); // 建立一个3分钟的时间段 System.out.println(d2.getSeconds()); // 1 System.out.println(d4.getSeconds()); // 180 // 时间间隔是年月日 Period p1 = Period.between(date1, date2); // date2 - date1 Period p2 = Period.ofDays(10); System.out.println(p1.getDays()); // -1 System.out.println(p2.getDays()); // 10
修改LocalDate对象属性字符串
LocalDate date1 = LocalDate.of(2014, 3, 18); // 以比较直观的方式修改 LocalDate date1 = date1.withYear(2011); // 修改年 LocalDate date1 = date1.withMonth(11); // 修改月 LocalDate date1 = date1.withDayOfMonth(25); // 修改日 // 以相对方式修改 date1.minusYears(1); // 减1年 date1.plusYears(2); // 加2年 date1.plus(3, ChronoUnit.MONTHS); // 加3月 date1.plus(22, ChronoUnit.DAYS); // 加22天
LocalDate date1 = LocalDate.of(2014, 3, 18); // 当前日期以后包括当前日期的第一个星期日 System.out.println(date1.with(nextOrSame(DayOfWeek.SUNDAY))); // 2014-03-23 // 当月第一个星期日 System.out.println(date1.with(firstInMonth(DayOfWeek.SUNDAY))); // 2014-03-02 // 当月最后一个星期日 System.out.println(date1.with(lastInMonth(DayOfWeek.SUNDAY))); // 2014-03-30 // 当月第一天 System.out.println(date1.with(firstDayOfMonth())); // 2014-03-01 // 当月最后一天 System.out.println(date1.with(lastDayOfMonth())); // 2014-03-31 // 当年第一天 System.out.println(date1.with(firstDayOfYear())); // 2014-01-01 // 明年第一天 System.out.println(date1.with(firstDayOfNextYear())); // 2015-01-01
求下一个工做日get
当前日期若是是周日到周四,日期向后移1天 当前日期若是是周五或周六,日期移到下周一it
方案一:实现一个TemporalAdjuster类io
public class NextWorkingDay implements TemporalAdjuster { @Override public Temporal adjustInto(Temporal temporal) { // 当前日期是周几 DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); // 判断要向后移几天 int dayToAdd = 1; if (dow == DayOfWeek.FRIDAY) dayToAdd = 3; else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2; return temporal.plus(dayToAdd, ChronoUnit.DAYS); } }
方案二:直接使用Lambda使用
LocalDate nextWorkingDate = LocalDate.now() .with(temporal -> { // 当前日期是周几 DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); // 判断要向后移几天 int dayToAdd = 1; if (dow == DayOfWeek.FRIDAY) dayToAdd = 3; else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2; return temporal.plus(dayToAdd, ChronoUnit.DAYS); });
方案三:使用Lambda实现一个TemporalAdjuster
TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster( temporal -> { // 当前日期是周几 DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); // 判断要向后移几天 int dayToAdd = 1; if (dow == DayOfWeek.FRIDAY) dayToAdd = 3; else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2; return temporal.plus(dayToAdd, ChronoUnit.DAYS); } );
LocalDate date1 = LocalDate.of(2014, 3, 18); System.out.println(date1.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20140318 System.out.println(date1.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2014-03-18 LocalDate date2 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE); LocalDate date3 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE); // 按照某个模式建立DateTimeFormatter DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); System.out.println(date1.format(formatter)); // 2014/03/18 LocalDate date4 = LocalDate.parse("2018/08/14", formatter); // 建立一个本地化的DateTimeFormatter DateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN); System.out.println(date1.format(italianFormatter)); // 18. marzo 2014 LocalDate date5 = LocalDate.parse("18. marzo 2014", italianFormatter);
// 打印全部时区 ZoneId.getAvailableZoneIds().stream() .forEach(System.out::println); // 建立一个时区,格式为{区域}/{城市} ZoneId romeZone = ZoneId.of("Europe/Rome"); // 将老的时区对象转换为ZoneId ZoneId newZoneId = TimeZone.getDefault().toZoneId(); // 获取当前时区 ZoneId defaultZoneId = ZoneId.systemDefault(); System.out.println(defaultZoneId); // Asia/Shanghai
为时间点添加时区信息
ZoneId romeZone = ZoneId.of("Europe/Rome"); // 为时间点添加时区信息 LocalDate date1 = LocalDate.now(); ZonedDateTime zdt1 = date1.atStartOfDay(romeZone); LocalDateTime dateTime1 = LocalDateTime.now(); ZonedDateTime zdt2 = dateTime1.atZone(romeZone); Instant instant1 = Instant.now(); ZonedDateTime zdt3 = instant1.atZone(romeZone); // 将LocalDateTime转换为Instant Instant instantFromDateTime = dateTime1.toInstant(ZoneOffset.ofHours(0)); // 将Instant转换为LocalDateTime LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant1, romeZone);
利用和UTC/格林尼治时间的固定误差计算时区
// 不推荐使用 // 纽约落后于伦敦5小时 ZoneOffset newYorkOffset = ZoneOffset.of("-05:00"); System.out.println(newYorkOffset); OffsetDateTime dateTimeInNewYork = OffsetDateTime.of(LocalDateTime.now(), newYorkOffset);
ISO-8601日历系统是世界文明日历系统的事实标准。Java 8 还提供了4种其余日历系统,分别是
ThaiBuddhistDate MinguoDate JapaneseDate HijrahDate // 伊斯兰教日历
全部这些类以及LocalDate都实现了ChronoLocalDate接口。
LocalDate date1 = LocalDate.now(); JapaneseDate japaneseDate = JapaneseDate.from(date1); System.out.println(japaneseDate); // Japanese Heisei 30-08-14 Chronology japaneseChronology = Chronology.ofLocale(Locale.JAPAN); ChronoLocalDate now = japaneseChronology.dateNow(); System.out.println(now); // 2018-08-14