Java – 时间日期基础 Date For JDK8
简介
在JDK7中,提供了Date类,和Calendar日历类,在JDK8中,又新增了新的关于时间的相关类。
Date 类
ZoneId 时区
时区是地球时间中重要的组成部分,每个地区有不同的时区,Java提供了600个时区。
时区将影响Date类获取时间的准确性,也就是说如果设置的时区是“Asia/Shanghai”则获取时间上会 +8:00:00
获取Java所有时区
static Set<String> getAvailableZoneIds();
获取系统默认时区
static ZoneId systemDefault();
获取一个指定时区
static ZoneId of(String zoneId)
时区名可通过 getAvailableZoneIds() 获取
Instant 时间戳
Instant 是和时间关于对比和初始化时间类
获取当前时间(标准时间)
static Instant now();
根据(秒、毫秒、纳秒)系列获取 Instant 对象方法
static Instant ofXxxx();
其方法都是of开头的。
Instant.ofEpochMilli( 毫秒 );
Instant.ofEpochSecond( 秒 );
Instant.ofEpochSecond( 秒,纳秒 );
指定时区
ZonedDateTime atZone(ZoneId zone)
指定一个时区,需传入 ZoneId 类型的对象。
比较判断时间系列方法
boolean isXxx(Instant otherInstant)
Instant.ofEpochSecond(1L).isAfter(); // => 是否在这个时间之后
Instant.ofEpochSecond(1L).isBefore(); // => 是否在这个时间之前
时间相减系列方法
Instant minusXxx()
Instant.ofEpochSecond(1L).minusSeconds(n); // => 减掉n秒后的时间
Instant.ofEpochSecond(1L).minusMillis(n); // => 减掉n毫秒后的时间
Instant.ofEpochSecond(1L).minusNanos(n); // => 减掉n纳秒后的时间
时间相加系列方法
Instant plusXxx()
Instant.ofEpochSecond(1L).plusMillis(n); // => 增加n毫秒后的时间
Instant.ofEpochSecond(1L).plusSeconds(n); // => 增加n秒后的时间
Instant.ofEpochSecond(1L).plusNanos(n); // => 增加n纳秒后的时间
ZoneDateTime 带时区的时间
ZoneDateTime 是和时间关于对比和初始化时间类,但这个类会被附加时区
获取当前时间(当地时区的时间)
static ZoneDateTime now();
根据(秒、毫秒、纳秒)系列获取 ZoneDateTime 对象方法
static ZoneDateTime ofXxxx(时间);
其方法都是of开头的。
ZonedDateTime.of(2022,12,22,11,11,11,0,ZoneId.of("Asia/Shanghai")); 方法参数如下 of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone)
修改时间系列方法
ZonedDateTime withXxx(时间)
ZonedDateTime withYear()
ZonedDateTime withMonth()
ZonedDateTime withHour()
ZonedDateTime withMinute()
ZonedDateTime withSecond()
......
时间相减系列方法
ZonedDateTime minusXxx(时间)
ZonedDateTime minusYears(n); // 减去n年
ZonedDateTime minusMonths(n); // 减去n月
ZonedDateTime minusDays(n); // 减去n日
ZonedDateTime minusHours(n); // 减去n时
ZonedDateTime minusMinutes(n); // 减去n分
ZonedDateTime minusSeconds(n); // 减去n秒
......
时间相加系列方法
ZonedDateTime plusXxx(时间)
ZonedDateTime plusYears(n); // 增加n年
ZonedDateTime plusMonths(n); // 增加n月
ZonedDateTime plusDays(n); // 增加n日
ZonedDateTime plusHours(n); // 增加n时
ZonedDateTime plusMinutes(n); // 增加n分
ZonedDateTime plusSeconds(n); // 增加n秒
......
注意:JDK8新增的时间对象都是不可变的,如果我们修改了,调用者不会发生改变,而是产生一个新的对象返回。
SimpleDateFormat 日期格式化
DateTimeFormatter
DateTimeFormatter 可以实现指定格式的日期,使用方法如下:
// 获取时间对象,带有时区的
ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
// 定义解析、格式化器 => 格式例:2022-10-10 12:22:23 周二 下午
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");
// 对时间进行格式化操作
String format = dtf.format(time);
Calendar 日历
LocalDate 年月日
这个类只处理年月日时间关系,不处理时分秒时间关系
//1.获取当前时间的日历对象(包含 年月日)
LocalDate nowDate = LocalDate.now();
//System.out.println("今天的日期:" + nowDate);
//2.获取指定的时间的日历对象
LocalDate ldDate = LocalDate.of(2023, 1, 1);
System.out.println("指定日期:" + ldDate);
System.out.println("=============================");
//3.get系列方法获取日历中的每一个属性值//获取年
int year = ldDate.getYear();
System.out.println("year: " + year);
//获取月//方式一:
Month m = ldDate.getMonth();
System.out.println(m);
System.out.println(m.getValue());
//方式二:
int month = ldDate.getMonthValue();
System.out.println("month: " + month);
//获取日
int day = ldDate.getDayOfMonth();
System.out.println("day:" + day);
//获取一年的第几天
int dayofYear = ldDate.getDayOfYear();
System.out.println("dayOfYear:" + dayofYear);
//获取星期
DayOfWeek dayOfWeek = ldDate.getDayOfWeek();
System.out.println(dayOfWeek);
System.out.println(dayOfWeek.getValue());
//is开头的方法表示判断
System.out.println(ldDate.isBefore(ldDate));
System.out.println(ldDate.isAfter(ldDate));
//with开头的方法表示修改,只能修改年月日
LocalDate withLocalDate = ldDate.withYear(2000);
System.out.println(withLocalDate);
//minus开头的方法表示减少,只能减少年月日
LocalDate minusLocalDate = ldDate.minusYears(1);
System.out.println(minusLocalDate);
//plus开头的方法表示增加,只能增加年月日
LocalDate plusLocalDate = ldDate.plusDays(1);
System.out.println(plusLocalDate);
//-------------
// 判断今天是否是你的生日
LocalDate birDate = LocalDate.of(2000, 1, 1);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());
MonthDay nowMd = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗? " + birMd.equals(nowMd));//今天是你的生日吗?
LocalTime 时分秒
这个类只处理时分秒时间关系,不处理年月日时间关系
// 获取本地时间的日历对象。(包含 时分秒)
LocalTime nowTime = LocalTime.now();
System.out.println("今天的时间:" + nowTime);
int hour = nowTime.getHour();//时
System.out.println("hour: " + hour);
int minute = nowTime.getMinute();//分
System.out.println("minute: " + minute);
int second = nowTime.getSecond();//秒
System.out.println("second:" + second);
int nano = nowTime.getNano();//纳秒
System.out.println("nano:" + nano);
System.out.println("------------------------------------");
System.out.println(LocalTime.of(8, 20));//时分
System.out.println(LocalTime.of(8, 20, 30));//时分秒
System.out.println(LocalTime.of(8, 20, 30, 150));//时分秒纳秒
LocalTime mTime = LocalTime.of(8, 20, 30, 150);
//is系列的方法
System.out.println(nowTime.isBefore(mTime));
System.out.println(nowTime.isAfter(mTime));
//with系列的方法,只能修改时、分、秒
System.out.println(nowTime.withHour(10));
//plus系列的方法,只能修改时、分、秒
System.out.println(nowTime.plusHours(10));
LocalDateTime 年月日时分秒
这个类可以处理所有时间关系,包含 LocalDate 和 LocalTime 更多的时间处理关系
// 当前时间的的日历对象(包含年月日时分秒)
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("今天是:" + nowDateTime);//今天是:
System.out.println(nowDateTime.getYear());//年
System.out.println(nowDateTime.getMonthValue());//月
System.out.println(nowDateTime.getDayOfMonth());//日
System.out.println(nowDateTime.getHour());//时
System.out.println(nowDateTime.getMinute());//分
System.out.println(nowDateTime.getSecond());//秒
System.out.println(nowDateTime.getNano());//纳秒
// 日:当年的第几天
System.out.println("dayofYear:" + nowDateTime.getDayOfYear());
//星期
System.out.println(nowDateTime.getDayOfWeek());
System.out.println(nowDateTime.getDayOfWeek().getValue());
//月份
System.out.println(nowDateTime.getMonth());
System.out.println(nowDateTime.getMonth().getValue());
LocalDate ld = nowDateTime.toLocalDate();
System.out.println(ld);
LocalTime lt = nowDateTime.toLocalTime();
System.out.println(lt.getHour());
System.out.println(lt.getMinute());
System.out.println(lt.getSecond());
时间工具类
Duration 时间间隔(时分秒)
这个类处理的时间通常在时分秒甚至纳秒方面
// 本地日期时间对象。
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 出生的日期时间对象
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println("相差的时间间隔对象:" + duration);
System.out.println("============================================");
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的纳秒数
Period 时间间隔(年月日)
这个类处理的时间关系通常在年月日方面
// 当前本地 年月日
LocalDate today = LocalDate.now();
System.out.println(today);
// 生日的 年月日
LocalDate birthDate = LocalDate.of(2000, 1, 1);
System.out.println(birthDate);
Period period = Period.between(birthDate, today);//第二个参数减第一个参数
System.out.println("相差的时间间隔对象:" + period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
System.out.println(period.toTotalMonths());
ChronoUnit 时间间隔
这个类可以处理所有时间单位关系
// 当前时间
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 生日时间
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1,0, 0, 0);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
共有 0 条评论