Java8 时间操作
java8的操作时间与以往的不同,以往用的比较多的是,时间戳通过System去获取,获取日期时间通过Date、Calendar类来操作,获取日期时间格式输出则通过SimpleDateFormat来转化,Java8后,以上的仍然可以使用,不过新出了操作时间的API。(经查阅资料,SimpleDateFormat是线程不安全的,这跟使用方式有关,有兴趣可以了解下)。
Java8 的各个日期时间类型
- LocalDate:不包含时间的日期,例如:2020-08-24,单纯的表示日期
- LocalTime:与LocalDate的用法类似,但表示的时间,没有日期,例如:12:06:51.146,单纯的时间概念
- LocalDateTime:这个从命名来看,其实就已经很显然了,就是日期+时间(没有偏移量,时区),例如:22020-08-24T12:06:51.146
- ZonedDateTime:包含时区的完整日期时间,偏移量是以UTC/格林威治时间为基准,例如:2020-08-24T10:12:37.646+08:00[GMT+08:00]
- Instant:时间戳,与System.currentTimeMillis()类似,Instant.now().toEpochMilli();
- Duration:表示一个时间段
- Period:用来表示以年月日来衡量一个时间段
- DateTimeFormatter:日期解析格式化类
- Clock:时钟
LocalDate
通过代码实现,玩转一下LocalDate:
public static void localDateDemo() {
//获取当前时间
LocalDate localDate = LocalDate.now();
System.out.println("当前年月日:" + localDate);
//获取年
int yearOneWay = localDate.getYear();
int yearAnotherWay = localDate.get(ChronoField.YEAR);
System.out.println("yearOneWay:" + yearOneWay + ",yearAnotherWay:" + yearAnotherWay);
//获取年的天数
int yearDays = localDate.lengthOfYear();
System.out.println("今年多长:" + yearDays);
//获取月
int month = localDate.getMonth().getValue();
int month1 = localDate.getMonthValue();
int month2 = localDate.get(ChronoField.MONTH_OF_YEAR);
System.out.println("今年月份 month:" + month);
System.out.println("今年月份 month1:" + month1);
System.out.println("今年月份 month2:" + month2);
//虎丘月的天数
int monthDays1 = localDate.lengthOfMonth();
System.out.println("本月多长 monthDays1:" + monthDays1);
//获取天
int daysOfYear = localDate.getDayOfYear();
int daysOfYears1 = localDate.get(ChronoField.DAY_OF_YEAR);
System.out.println("今天是今年的第几天:daysOfYear:" + daysOfYear + ", daysOfYear1:" + daysOfYears1);
int daysOfMonth = localDate.getDayOfMonth();
int daysOfMonth1 = localDate.get(ChronoField.DAY_OF_MONTH);
System.out.println("今天是这个月的第几天:daysOfMonth:" + daysOfMonth + ",dayOfMonth1:" + daysOfMonth1);
//获取星期
int dayOfWeek = localDate.getDayOfWeek().getValue();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
int dayOfWeek2 = localDate.getDayOfWeek().get(ChronoField.DAY_OF_WEEK);
System.out.println("这是星期的第几天:dayOfWeek:" + dayOfWeek + ",dayOfWeek1:" + dayOfWeek1 + ",dayOfWeek2:" + dayOfWeek2);
}
运行结果如下:
当前年月日:2020-08-24
yearOneWay:2020,yearAnotherWay:2020
今年多长:366
今年月份 month:8
今年月份 month1:8
今年月份 month2:8
本月多长 monthDays1:31
今天是今年的第几天:daysOfYear:237, daysOfYear1:237
今天是这个月的第几天:daysOfMonth:24,dayOfMonth1:24
这是星期的第几天:dayOfWeek:1,dayOfWeek1:1,dayOfWeek2:1
LocalTime
示例代码
public static void localTimeDemo() {
LocalTime localTime = LocalTime.now();
//当前时间
System.out.println("当前时间:localTime:" + localTime);
//获取时
int hours = localTime.getHour();
System.out.println("当前小时:hours:" + hours + " ,HOUR_OF_DAY:" + localTime.get(ChronoField.HOUR_OF_DAY)
+ ",HOUR_OF_AMPM:" + localTime.get(ChronoField.HOUR_OF_AMPM)
+ ",CLOCK_HOUR_OF_DAY: " + localTime.get(ChronoField.CLOCK_HOUR_OF_DAY)
+ ",CLOCK_HOUR_OF_AMPM: " + localTime.get(ChronoField.CLOCK_HOUR_OF_AMPM));
//当前分
int m = localTime.getMinute();
System.out.println("当前分:minutes:" + m + " ,MINUTE_OF_DAY:" + localTime.get(ChronoField.MINUTE_OF_DAY)
+ ",MINUTE_OF_HOUR:" + localTime.get(ChronoField.MINUTE_OF_HOUR));
//获取秒
int second = localTime.getSecond();
System.out.println("当前秒:second:" + second + " ,SECOND_OF_DAY:" + localTime.get(ChronoField.SECOND_OF_DAY)
+ ",SECOND_OF_MINUTE:" + localTime.get(ChronoField.SECOND_OF_MINUTE));
}
运行结果:
当前时间:localTime:11:04:03.570
当前小时:hours:11 ,HOUR_OF_DAY:11,HOUR_OF_AMPM:11,CLOCK_HOUR_OF_DAY: 11,CLOCK_HOUR_OF_AMPM: 11
当前分:minutes:4 ,MINUTE_OF_DAY:664,MINUTE_OF_HOUR:4
当前秒:second:3 ,SECOND_OF_DAY:39843,SECOND_OF_MINUTE:3
LocalDateTime
代码示例:
public static void localDateTimeDemo() {
// 当前日期和时间
LocalDateTime today = LocalDateTime.now();
System.out.println("现在是:" + today);
// 创建指定日期和时间
LocalDateTime anotherDay = LocalDateTime.of(2020, Month.AUGUST, 8, 8, 8, 8);
System.out.println("创建的指定时间是:" + anotherDay);
// 拼接日期和时间
// 使用当前日期,指定时间生成的 LocalDateTime
LocalDateTime thisTime = LocalTime.now().atDate(LocalDate.of(2020, 8, 8));
System.out.println("拼接的日期是:" + thisTime);
// 使用当前日期,指定时间生成的 LocalDateTime
LocalDateTime thisDay = LocalDate.now().atTime(LocalTime.of(12, 24, 12));
System.out.println("拼接的日期是:" + thisDay);
// 指定日期和时间生成 LocalDateTime
LocalDateTime thisDayAndTime = LocalDateTime.of(LocalDate.of(2020, 8, 8), LocalTime.of(12, 24, 12));
System.out.println("拼接的日期是:" + thisDayAndTime);
// 获取LocalDate
LocalDate todayDate = today.toLocalDate();
System.out.println("今天日期是:" + todayDate);
// 获取LocalTime
LocalTime todayTime = today.toLocalTime();
System.out.println("现在时间是:" + todayTime);
}
运行结果:
现在是:2020-08-24T11:08:55.462
创建的指定时间是:2020-08-08T08:08:08
拼接的日期是:2020-08-08T11:08:55.463
拼接的日期是:2020-08-24T12:24:12
拼接的日期是:2020-08-08T12:24:12
今天日期是:2020-08-24
现在时间是:11:08:55.462
Instant
代码示例:
public static void instantDemo() {
//当前时间
Instant instant = Instant.now();
//获取到秒数
System.out.println("当前秒数:" + instant.getEpochSecond());
//获取到毫秒
System.out.println("当前纳秒数:" + instant.toEpochMilli());
}
运行结果:
当前秒数:1598238919
当前纳秒数:1598238919914
Duration
代码示例:
public static void durationDemo() {
LocalDateTime from = LocalDateTime.now();
LocalDateTime to = LocalDateTime.now().plusDays(1);
// 通过between()方法创建
Duration duration = Duration.between(from, to);
System.out.println("时间段,duration天数:" + duration.toDays() + ",小时:" + duration.toHours() + ", 分:" + duration.getSeconds());
// 通过of()方法创建,该方法参数为时间段长度和时间单位。
// 7天
Duration duration1 = Duration.of(7, ChronoUnit.DAYS);
System.out.println("时间段,duration1天数:" + duration1.toDays() + ",小时:" + duration1.toHours() + ", 分:" + duration1.getSeconds());
// 60秒
Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);
System.out.println("时间段,duration2:" + duration2.toDays() + ",小时:" + duration2.toHours() + ", 分:" + duration2.getSeconds());
}
运行结果:
时间段,duration天数:1,小时:24, 分:86400
时间段,duration1天数:7,小时:168, 分:604800
时间段,duration2:0,小时:0, 分:60
Period
代码示例:
private static void periodDemo() {
// 通过of方法
Period period = Period.of(2012, 12, 24);
System.out.println("年相差,月相差,日相差,年:" + period.getYears() + " 月:" + period.getMonths() + " 日:" + period.getDays()) ;
// 通过between方法
Period period1 = Period.between(LocalDate.now(), LocalDate.of(2021,12,31));
System.out.println("年相差,月相差,日相差,年:" + period1.getYears() + " 月:" + period1.getMonths() + " 日:" + period1.getDays()) ;
System.out.println("年相差:"+ period1.get(ChronoUnit.YEARS)
+ "月相差:"+ period1.get(ChronoUnit.MONTHS)
+ "日相差:"+ period1.get(ChronoUnit.DAYS) );
}
结果:
年相差,月相差,日相差,年:2012 月:12 日:24
年相差,月相差,日相差,年:1 月:4 日:7
年相差:1月相差:4日相差:7
Clock
代码示例
public static void clockDemo() {
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock.millis());
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock : " + defaultClock.millis());
System.out.println("当前时间戳:" + System.currentTimeMillis());
}
运行结果
Clock : 1598240101472
Clock : 1598240101480
当前时间戳:1598240101480
DateTimeFormatter
代码示例:
public static void dateFomate() {
LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
//日期转字符串
String str = date.format(format1);
System.out.println("日期转换为字符串:" + str);
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
//字符串转日期
LocalDateTime date2 = LocalDateTime.parse(str, format2);
System.out.println("日期类型:" + date2);
}
运行结果:
日期转换为字符串:2020/08/24 11:38:05
日期类型:2020-08-24T11:38:05