zoukankan      html  css  js  c++  java
  • Java8 新的日期和时间API(笔记)

    • LocalDate LocalTime Instant duration以及Period
    • 使用LocalDate和LocalTime
    //2017-03-20
    LocalDate date = LocalDate.of(2017, 3, 20);
    int year = date.getYear();//2017  返回年份
    Month month = date.getMonth();//MARCH 返回月份 3月
    int dayOfMonth = date.getDayOfMonth();//20 返回月中的第几天
    DayOfWeek dayOfWeek = date.getDayOfWeek();//MONDAY 返回星期几
    int len = date.lengthOfMonth();//31 返回这个月有多少天
    boolean leapYear = date.isLeapYear(); //false 是否是闰年
    
    //获取系统时间
    LocalDate now = LocalDate.now(); //相当于 new Date()
     
    //14:33:45
    LocalTime time = LocalTime.of(14, 33, 45);
    int hour = time.getHour();//
    int minute = time.getMinute();//
    int second = time.getSecond();////还可以通过解析代表他们的字符串创建.
    LocalDate date = LocalDate.parse("2017-03-20");
    LocalDate dateTime = LocalDate.parse("14:33:20");
    • 合并日期和时间
    LocalDate date = LocalDate.of(2017, 3, 20);
    LocalTime time = LocalTime.of(14, 33, 45);
    LocalDateTime dateTime = LocalDateTime.of(2017, 3, 20, 14, 41, 40);
    LocalDateTime dateTime1 = LocalDateTime.of(date, time);
    LocalDateTime dateTime2 = date.atTime(14, 33, 45);
    LocalDateTime dateTime3 = date.atTime(time);
    LocalDateTime dateTime4 = time.atDate(date);
    //从LocalDateTime装换为LocalDate和LocalTime
    LocalDate localDate = dateTime.toLocalDate();
    LocalTime localTime = dateTime.toLocalTime();
     
    • 机器的日期和时间格式
    • 操纵,解析和格式化日期
    //以直观的方式操作LocalDate属性
    LocalDate date = LocalDate.of(2017, 3, 20);//2017-3-20
    LocalDate localDate = date.withYear(2011);//2011-3-20
    LocalDate localDate1 = localDate.withDayOfMonth(25);//2011-3-25
    LocalDate with = localDate1.with(ChronoField.MONTH_OF_YEAR, 9);//2011-9-25
    
    //以相对的方式操作LocalDate属性
    
    LocalDate localDate2 = date.plusWeeks(1);//一周后 2017-03-27
    LocalDate localDate3 = localDate2.minusYears(3);//3年前 2014-03-27
    LocalDate plus = localDate3.plus(6, ChronoUnit.MONTHS);//6个月后 2014-09-27
     
    下面介绍LocalDate LocalTime LocalDateTime Instant的通用方法:
    //Temporal是接口  所有的日期时间类 实现了该接口
    //from 依据传入的Temporal对象创建对象实例
    //now 依据系统时钟创建Temporal对象
    //of 有Temporal对象的某个部分创建该对象的实例
    //parse 由字符串创建Temporal对象的实例
    //atOffset 将Temporal对象和某个时区偏移相结合
    //atZone 将Temporal对象和某个时区相结合
    //format 使用某个指定的格式器将Temporal对象转换为字符串(Instant类不提供该方法)
    //get 读取Temporal对象的某一部分
    //minus 创建Temporal对象的一个副本,通过将当前Temporal对象的值减去一定的时长创建该副本
    //plus 创建Temporal对象的一个副本,通过将当前Temporal对象的值加上一定的时长创建该副本
    //with 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本
    • 使用TemporalAdjuster 
    import java.time.LocalDate;
    import static java.time.temporal.TemporalAdjusters.*;
    
    /**
     * @author Darcy
     *         Created by Administrator on 2017/3/20.
     */
    public class TestTemporalAdjuster {
        public static void main(String[] args) {
            LocalDate date = LocalDate.of(2017, 3, 20);
            LocalDate date1 = date.with(nextOrSame(DayOfWeek.SUNDAY));//下一个周日 2017-03-26
            LocalDate date3 = date1.with(lastDayOfMonth());//当月最后一天 2017-03-31
            System.out.println(date3);
        }
    
    }
     
    下面是工厂方法介绍:
    //dayOfWeekInMonth  创建一个新的日期,它的值为同一个月中每一周的第几天,
    //firstDayOfMonth  创建一个新的日期,它的值为当月的第一天
    //firstDayOfNextMonth  创建一个新的日期,它的值为下个月的第一天
    //firstDayOfNextYear  创建一个新的日期,它的值为明年的第一天
    //firstDayOfYear  创建一个新的日期,它的值为当年的第一天
    //firstInMonth 创建一个新的日期 它的值同一个月中,第一个符合星期几要求的值
    //lastDayOfMonth  创建一个新的日期,它的值为当月的最后一天
    //lastDayOfNextMonth  创建一个新的日期,它的值为下个月的最后一天
    //lastDayOfNextYear  创建一个新的日期,它的值为明年的最后一天
    //lastDayOfYear  创建一个新的日期,它的值为当年的最后一天
    //lastInMonth 创建一个新的日期 它的值同一个月中,最后一个符合星期几要求的值
    //next/previous 创建一个新的日期 并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期
    //nextOrSame/previousOrSame 创建一个新的日期 并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期 如果该日期符合要求,直接返回改对象
     
    定制TemporalAdjuster实现自定义的日期操作
    /**
     * 定制TemporalAdjuster 能计算明天的日期,同时过滤掉周六和周日
     *
     * @author Darcy
     *         Created by Administrator on 2017/3/20.
     */
    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;
            if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
            return temporal.plus(dayToAdd, ChronoUnit.DAYS);
        }
    
    }
     
    使用方式:
    LocalDate date = LocalDate.of(2017, 3, 20);
    LocalDate with = date.with(new NextWorkingDay());
     
    还有2中实现方式:
    //或者用lambda表达式 但是这种不利于复用
    LocalDate with1 = date.with(temporal -> {
        DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        int dayToAdd = 1;//正常情况下增加一天
        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
        if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    });
    //便于复用
    TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(temporal -> {
        //读取当天日期
        DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        int dayToAdd = 1;//正常情况下增加一天
        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
        if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    });
    
    date.with(nextWorkingDay);
     
    • 打印输出及解析日期-时间对象
    LocalDate date = LocalDate.of(2017, 3, 20);
    String format = date.format(DateTimeFormatter.BASIC_ISO_DATE);//20170320
    String format2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);//2017-03-20
    
    LocalDate.parse("20170320", DateTimeFormatter.BASIC_ISO_DATE);
    LocalDate.parse("2017-03-20", DateTimeFormatter.ISO_LOCAL_DATE);
    
    //按照某种格式创建DateTimeFormatter
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    String format1 = date.format(dateTimeFormatter);
    LocalDate parse = LocalDate.parse(format1, dateTimeFormatter);
    
    //如果需要更加细粒度的控制,DateTimeFormatterBuilder类提供了更复杂的格式器,可以使用 一步一步的构造自己的格式器
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.DAY_OF_MONTH)
            .appendLiteral(". ")
            .appendText(ChronoField.MONTH_OF_YEAR)
            .appendLiteral(" ")
            .appendText(ChronoField.YEAR)
            .parseCaseInsensitive()//对大小写不敏感
            .toFormatter(Locale.CHINA);
    LocalDate date3 = LocalDate.of(2017, 3, 20);
    String format3 = date3.format(formatter); //20. 三月 2017
     
    • 处理不同时区的历法
    //地区ID都为{区域}/{城市}的格式,这些地区集合的设定都由英特网编号分配机构(IANA)的市区数据库提供
    ZoneId romeZone = ZoneId.of("Europe/Rome");
    //可以通过Java8的新方法 将老的时区装换为ZoneId
    ZoneId zoneId = TimeZone.getDefault().toZoneId();
    
    LocalDate date = LocalDate.of(2017, 3, 20);
    ZonedDateTime zonedDateTime = date.atStartOfDay(romeZone);
    LocalDateTime dateTime = LocalDateTime.of(2017, 3, 20, 14, 41, 40);
    ZonedDateTime zonedDateTime1 = dateTime.atZone(romeZone);
    Instant now = Instant.now();
    ZonedDateTime zonedDateTime2 = now.atZone(romeZone);
    
    //使用别的日历系统
    //java8 另外提供了4中其他的日历系统 ThaiBuddhistDate MinguoDate JapaneseDate HijrahDate
    ThaiBuddhistDate now1 = ThaiBuddhistDate.now();//ThaiBuddhist BE 2560-03-20
    MinguoDate now2 = MinguoDate.now();//Minguo ROC 106-03-20
    JapaneseDate now3 = JapaneseDate.now();//Japanese Heisei 29-03-20
    HijrahDate now4 = HijrahDate.now();//Hijrah-umalqura AH 1438-06-21
    JapaneseDate from = JapaneseDate.from(date); //Japanese Heisei 29-03-20
     
  • 相关阅读:
    LeetCode 452. 用最少数量的箭引爆气球
    LeetCode 451. 根据字符出现频率排序
    LeetCode 464. 我能赢吗
    LeetCode 2. 两数相加
    @RendSection{"scripts",require:false}的作用
    js中变量含(参数、数组)作用域传递问题
    Web Api通过Route、RoutePrefix等特性设置路由
    SQLserver中存储图片
    RDLC的部署(无法找到Microsoft.ReportViewer.ProcessingObjectModel.dll文件)
    C# 发送Http协议 模拟 Post Get请求
  • 原文地址:https://www.cnblogs.com/ten951/p/6590473.html
Copyright © 2011-2022 走看看