• 日期和时间API


    日期与时间

    LocalDate

    创建一个LocalDate对象并读取其值

    // 根据年月日创建日期
    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

    创建LocalTime并读取值

    // 根据时分秒创建时间
    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

    直接创建LocalDateTime对象或通过合并日期和时间的方式创建

    // 直接创建日期时间
    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();
    

    Instant

    机器的日期和时间格式

    // 获取当前时刻时间戳
    System.out.println(Instant.now().toEpochMilli()); // 1534255959679
    

    时间段

    Duration & Period

    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天
    

    TemporalAdjuster

    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
    

    定制一个TemopralAdjuster

    求下一个工作日

    当前日期如果是周日到周四,日期向后移1天
    当前日期如果是周五或周六,日期移到下周一

    方案一:实现一个TemporalAdjuster类

    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

    // 打印所有时区
    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
    

    ZonedDateTime

    为时间点添加时区信息

    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);
    

    ZoneOffset

    利用和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
    
  • 相关阅读:
    Python学习——网站收集
    基于三轴加速计的运动识别与控制系统
    Unity小记
    Unity3d 札记-Survival Shooting 知识点汇总--受到伤害时屏幕闪血光如何做到
    Unity3d 札记-Survival Shooting 知识点汇总--Navigation 自动寻路的运用
    Unity3d 札记-Survival Shooting 知识点汇总--AnimationController
    Unity3d札记 --TanksTutorial收获与总结
    Unity3d 札记-Tanks Tutorial 知识点汇总--游戏流程的控制
    Unity3d 札记-Tanks Tutorial 知识点汇总---如何发射子弹
    Unity3d 札记-Tanks Tutorial 知识点汇总---子弹爆炸效果的实现
  • 原文地址:https://www.cnblogs.com/okokabcd/p/9478833.html
Copyright © 2020-2023  润新知