Java日期时间操作

298 阅读3分钟

一、JDK8之前

Date类使用(JDK1.0)

Date date1 = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-03");
        Date date = new Date(); //分配一个 Date对象,并初始化它
        System.out.println(date); 
        System.out.println(date.getTime()); //返回自1970年1月1日以来,由此 Date对象表示的00:00:00 GMT的毫秒数
        System.out.println(date.before(date1));//date是不是在date1之前
        System.out.println(date.compareTo(date1));//date和date1比较 date大于date1返回1,date小于date1返回-1,相等返回0
        System.out.println(date.after(date1));//date是不是在date1之后
        //下面是已经弃用的
        System.out.println(date.getYear());//年
        System.out.println(date.getMonth());//月,从0开始
        System.out.println(date.getDay());//一周中第几日,从星期天为0
        System.out.println(date.getDate());//一个月中第几日,从1开始
        System.out.println(date.getHours());//小时,从1开始
        System.out.println(date.getMinutes());//分钟
        System.out.println(date.getSeconds());//秒
        System.out.println(date.toLocaleString());//将时间转为本地格式的字符串

Calendar类使用(JDK1.1)

获取值

Calendar instance = Calendar.getInstance();
        long time1 = Calendar.getInstance().getTimeInMillis();//以毫秒为单位返回此日历的时间值。
        System.out.println(time1);
        System.out.println(instance.get(Calendar.YEAR));//获取年
        System.out.println(instance.get(Calendar.MONTH));//获取月 0 - 11
        System.out.println(instance.get(Calendar.DATE));//天 一个月中的第几天
        System.out.println(instance.get(Calendar.HOUR_OF_DAY));//小时
        System.out.println(instance.get(Calendar.MINUTE));//分钟
        System.out.println(instance.get(Calendar.SECOND));//秒
        System.out.println(instance.get(Calendar.DAY_OF_WEEK));//周日是1/周一是2

设置值

Calendar instance = Calendar.getInstance();
        System.out.println(instance.getTime());
        instance.set(2013, 5, 4, 13, 44, 51);//设置年月日时分秒(月份0代表1月)
        System.out.println(instance.getTime());
        instance.set(Calendar.YEAR, 2014);//设置年
        instance.set(Calendar.MONTH, 7);//设置月(月份0代表1月)
        instance.set(Calendar.DATE, 11);//设置日
        instance.set(Calendar.HOUR_OF_DAY, 15);//设置时
        instance.set(Calendar.MINUTE, 33);//设置分
        instance.set(Calendar.SECOND, 32);//设置秒
        System.out.println(instance.getTime());
        instance.setTimeInMillis(0);//转换成格林威治时间
        System.out.println(instance.getTime());//也就是1970-01-01 08:00:00.

运算值

Calendar instance = Calendar.getInstance();
        instance.add(Calendar.YEAR, 1);//增加年
        instance.add(Calendar.MONTH, 1);//增加月
        instance.add(Calendar.DATE, 1);//增加日
        instance.add(Calendar.HOUR_OF_DAY, -1);//减少小时
        instance.add(Calendar.MINUTE, 1);//增加分
        instance.add(Calendar.SECOND, 1);//增加秒
        instance.add(Calendar.WEEK_OF_MONTH, 1);//增加周
        instance.add(Calendar.WEEK_OF_YEAR, 1);//增加周
        System.out.println(instance.getTime().toLocaleString());

Calendar其他操作

Calendar instance = Calendar.getInstance();
Date time = instance.getTime();//返回值是Date Calendar -> Date
System.out.println(time);
Date time2 = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-03");
instance.setTime(time2);//设置时间
Calendar instance2 = Calendar.getInstance();
System.out.println(instance.compareTo(instance2));//比较时间 instance大于instance2返回1,instance小于instance2返回-1,相等返回0
//Calendar的子类GregorianCalendar
GregorianCalendar cal =
                (GregorianCalendar) GregorianCalendar.getInstance();
        System.out.println(cal.get(GregorianCalendar.YEAR));
        System.out.println(cal.isLeapYear(2020));

二、JDK1.8

JDK8主要提供了LocalDate、LocalTime、LocalDateTime 几个类 分别对应日期、时间、日期时间 使用方式一致

获取时间

LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);//当前的时间
        System.out.println(ldt.getYear());
        System.out.println(ldt.getMonth());//获取月对象
        System.out.println(ldt.getMonthValue());
        System.out.println(ldt.getDayOfMonth());//一个月的第多少天
        System.out.println(ldt.getDayOfWeek());//一周的星期几
        System.out.println(ldt.getDayOfYear());//一年的第几天
        System.out.println(ldt.getHour());//小时
        System.out.println(ldt.getMinute());//分钟
        System.out.println(ldt.getSecond());//秒

设置时间

        LocalDateTime ofldt = LocalDateTime.of(2020, 02, 02, 14, 22, 33);//设置时间
        System.out.println(ofldt);
        LocalDateTime ldt = LocalDateTime.now();
        LocalDateTime ldt2 = ldt.withDayOfMonth(11);//设置日 当月
        System.out.println(ldt);
        System.out.println(ldt2);
        LocalDateTime ldt3 = ldt.withDayOfYear(100);//设置日 当年
        System.out.println(ldt3);
        LocalDateTime ldt4 = ldt.withMonth(12);//设置月
        System.out.println(ldt4);
        LocalDateTime ldt5 = ldt.withYear(2000);//设置年
        System.out.println(ldt5);
        LocalDateTime ldt6 = ldt.withMinute(50);
        System.out.println(ldt6);//设置分
        LocalDateTime ldt7 = ldt.withSecond(30);
        System.out.println(ldt7);//设置秒

操作时间

每次操作都会返回新的对象

LocalDateTime ldt = LocalDateTime.now();
        LocalDateTime ldt2 = ldt.plusYears(2);//增加两年返回一个新的对象,不改变原对象
        System.out.println(ldt);
        System.out.println(ldt2);
        LocalDateTime ldt3 = ldt.plusMonths(2);//增加两个月
        System.out.println(ldt3);
        LocalDateTime ldt4 = ldt.plusDays(2);//增加两天
        System.out.println(ldt4);
        LocalDateTime ldt5 = ldt.plusHours(2);//增加两个小时
        System.out.println(ldt5);
        LocalDateTime ldt6 = ldt.plusMinutes(12);//增加12分钟
        System.out.println(ldt6);
        LocalDateTime ldt7 = ldt.plusSeconds(22);//增加22秒
        System.out.println(ldt7);
        LocalDateTime ldt11 = ldt.minusMonths(2);//减两个月
        System.out.println(ldt11);

其他操作

LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.plusHours(2);
int i2 = ldt2.compareTo(ldt);//ldt2大于ldt返回1,ldt2小于ldt2返回-1,相等返回0
System.out.println(ldt.isBefore(ldt2));//ldt在ldt2之前返回true,否则返回false
System.out.println(ldt.isAfter(ldt2));//ldt在ldt2之后返回true,否则返回false
//解析和格式化日期 DateTimeFormatter 是线程安全的
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
        LocalDateTime ldt = LocalDateTime.now();
        String format = ldt.format(dtf);//格式化日期
        System.out.println(format);
        LocalDateTime parse = ldt.parse(format, dtf);//时间反解析
        System.out.println(parse);

计算两个日期或时间的间隔

  • Duration:计算两个时间间隔
  • Period:计算两个日期间隔
        Instant now = Instant.now();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Instant now2 = Instant.now();
        Duration between = Duration.between(now, now2);
        System.out.println("所耗费时间:" + between);
        System.out.println(between.getSeconds());

        System.out.println("----------------------------");
        LocalDate ld1 = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2011, 1, 16);
        Period pe = Period.between(ld1, ld2);
        System.out.println(pe.getYears());//差了多少年/ld1比ld2少多少年
        System.out.println(pe.getMonths());//多少月
        System.out.println(pe.getDays());//查了多少日
        System.out.println(pe);//差了多少年多少月多少日

时间校正器TemporalAdjuster

        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);
        LocalDateTime ldt2 = ldt1.withDayOfMonth(10);
        System.out.println(ldt2);
        LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));//下一个周日 日期
        System.out.println(ldt3);
        //自定义下一个工作日
        LocalDateTime ldt5 = ldt1.with((l) -> {
            LocalDateTime ldt4 = (LocalDateTime) l;

            DayOfWeek dow = ldt4.getDayOfWeek();

            if(dow.equals(DayOfWeek.FRIDAY)){
                return ldt4.plusDays(3);
            }else if(dow.equals(DayOfWeek.SATURDAY)){
                return ldt4.plusDays(2);
            }else{
                return ldt4.plusDays(1);
            }
        });
        System.out.println(ldt5);

时区的处理

        Set<String> zoneIds = ZoneId.getAvailableZoneIds();//获取所有的时区
        zoneIds.forEach(System.out::println);//打印所有的时区
        LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));//上海时区
        System.out.println(now);
        ZonedDateTime now1 = ZonedDateTime.now(ZoneId.of("US/Pacific"));
        System.out.println(now1);
        
        Instant ins = Instant.now();//默认获取的是UTC时区为基准
        System.out.println(ins);
        System.out.println(ins.toEpochMilli());//获取时间戳 秒
        OffsetDateTime atOffset = ins.atOffset(ZoneOffset.ofHours(8));//设置时区
        System.out.println(atOffset);
        System.out.println(ins.getNano());//纳秒
        Instant instant = Instant.ofEpochSecond(5);//高边5秒钟
        System.out.println(instant);