这是根据Java核心技术卷二的日期和时间API选了一些总结的,有兴趣了解更多的可以看看电子版的第六章。
做的并不是很详细,希望帮助看客老爷能留个印象方便学习和印证
时间线
这里获得的是时刻,因此可以将本次讲的Instant对象作为时间戳理解。类似以前的Date类,不过在java8以前的时间类都或多或少有些不方便。
①是可变的、线程不安全。
②在初始化的时候会出现与我们正常感官不同的情况(年加上1901,月从0开始超过继续从0开始):
Date date = new Date(2020,12,5);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println("格式化:"+simpleDateFormat.format(date));
// 格式化:3921年01月05日
这样的格式化是我以前经常用到的,以本次的2020年12月5日为例
yyyy表示完整的年2020、yy表示后两位20
MM表示月
dd表示日期
格式化在之后再讲,٩( ´︶` )现在说说时间线的初始化:
-
Instant的常用初始化是now得到当前时间线,这里需要注意的是这里得到的时间线是格林威治时间,比中国慢8小时。(后面的时区时间讲解怎样修改时区)。
-
时间线代表时刻,那么肯定也要有代表一段时间的时间量啊。
-
给出java8给出的是Duration类进行时间长度的衡量。当前Instant也支持了compareTo的方法比较。
List<Integer> asList = Arrays.asList(20, -20, -71, 20, 84, 10, -62, -63, -58, -36);
// 获取当前时间戳
Instant start = Instant.now();
System.out.println("时间线:"+start);
// 时间线:2020-12-05T06:55:45.459Z
// 排序
System.out.println("排序前:"+asList);
// 排序前:[20, -20, -71, 20, 84, 10, -62, -63, -58, -36]
Collections.sort(asList);
System.out.println("排序后:"+asList);
// 排序后:[-71, -63, -62, -58, -36, -20, 10, 20, 20, 84]
Instant end = Instant.now();
// 时间长度
Duration timeElapsed = Duration.between(start, end);
// 将其转换为毫秒
// 可以转换为toHours、toDays...
// 如果要转换为秒java8必须用getSecends,java9才有toSecends方法
long millis = timeElapsed.toMillis();
System.out.println(millis+"milliseconds");
// 39milliseconds
本地日期
之前的都是在时间戳上面的操作,现在我们把时间放到我们熟悉的日期上面来。(具体看代码再对照我的讲解应该好一点)
- 本地日期函数LocalDate ,其的初始化也是now、of;
- 在java8新增的时间类中,计算加上多少天,减去多少小时等问题都有很简单的见名知意的方法如减去一天:minusDays(1)
- 其中getDayOfYear()方法是得到对于这一年的多少天。
- 比较时间可以用isBefore、isAfter方法,也可以用自己的比较方法(条条大路通罗马)
- 本地日期就是我们电脑上的日期,不用转时区。
初始化
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("today:"+today);
// today:2020-12-05
// 自定义日期
LocalDate birthday = LocalDate.of(2000, 12, 13);
// 使用枚举月份
birthday = LocalDate.of(2000, Month.SEPTEMBER, 13);
System.out.println("birthday:"+birthday);
// birthday:2000-09-13
System.out.println("==========================");
加减法运算
还有对于月、年等的加减运算
// 给日期加天数
LocalDate plusDays = LocalDate.of(2018, 1, 1).plusDays(255);
System.out.println("plusDays:"+plusDays);
System.out.println("==========================");
// plusDays:2018-09-13
日期的时间段
until 方法返回的是Period类类似Duration
LocalDate date1 = LocalDate.of(2020, 4, 2);
LocalDate date2 = LocalDate.of(2020, 8, 4);
// date1.unitl(date2);====返回date1到date2的时间段
System.out.println(date1.until(date2));
// P4M2D
System.out.println(date2.until(date1));
// P-4M-2D
System.out.println("==========================");
星期几
星期一对应1
DayOfWeek week = today.getDayOfWeek();
System.out.println("在本周的第几个星期:"+week);
// 在本周的第几个星期:SATURDAY
System.out.println("返回星期的值:"+week.getValue());
// 返回星期的值:6
本地时间
本地时间和本地日期一样也是电脑上的时间
时-分-秒-毫秒
LocalTime now_time = LocalTime.now();
System.out.println("当前时间:"+now_time);
// 当前时间:15:27:20.285
LocalTime plus_10_Minutes = now_time.plusMinutes(10);
System.out.println("当前时间加10分钟:"+plus_10_Minutes);
// 当前时间加10分钟:15:37:20.285
// 最后一位是毫秒
LocalTime localTime_of = LocalTime.of(12, 12, 12, 12);
System.out.println("of初始化本地时间:"+localTime_of);
// of初始化本地时间:12:12:12.000000012
int second = now_time.getSecond();
System.out.println("得到秒:"+second);
// 得到秒:20
时区时间
之前讲到Instant用的是格林威治时间,这里我们换成我们平时用的时区时间:
// 获得所有可用时区
Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
想要获得时区Id可以直接百度某地对应的时区,ZoneId.of(“时区”)可以获得时区
// 将instant时刻转时区时间
ZonedDateTime atZone = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println("将时刻转成指定的时区时间:"+atZone);
// 将时刻转成指定的时区时间:2020-12-05T15:32:32.264+08:00[Asia/Shanghai]
System.out.println("==========================");
如果使用 of 初始化时区时间,需要加上时区ID
// of初始化时区时间
ZonedDateTime zonedDateTime = ZonedDateTime.of(1999, 12, 13, 12, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
System.out.println("of初始化时区时间:"+zonedDateTime);
// of初始化时区时间:1999-12-13T12:00+08:00[Asia/Shanghai]
System.out.println("==========================");
// 时区时间的其他初始化方法
ZonedDateTime zonedDateTime2 = ZonedDateTime.of(
LocalDate.of(1999, 12, 13),LocalTime.of(0, 0) , ZoneId.of("Asia/Shanghai"));
System.out.println("通过本地日期、本地时间、时区构造时区时间:"+zonedDateTime2);
// 通过本地日期、本地时间、时区构造时区时间:1999-12-13T00:00+08:00[Asia/Shanghai]
System.out.println("==========================");
// 与本地日期和本地时间类似的plus、minus方法
System.out.println("使用加减函数:"+zonedDateTime.plusDays(322));
// 使用加减函数:2000-10-30T12:00+08:00[Asia/Shanghai]
// 比较类的isBefore、isAfter
System.out.println("zonedDateTime是否在zonedDateTime2之前:"+zonedDateTime.isBefore(zonedDateTime2));
// zonedDateTime是否在zonedDateTime2之前:false
格式化和解析
DateTimeFormatter代表日期时间格式器,使用ofPattern可以自定义格式器。
有了格式器可以通过format(日期时间)方法将日期转化为字符串
解析的话就需要:被解析的字符串,格式解析器
ZonedDateTime now = ZonedDateTime.now();
System.out.println("当前本地时区时间:"+now);
System.out.println("======================");
// 使用自定义的格式
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh-mm-ss");
String format2 = pattern.format(now);
System.out.println("使用自定义格式:"+format2);
// 使用自定义格式:2020年12月05日 03-39-52
System.out.println("======================");
// 解析本地日期
LocalDate parse = LocalDate.parse("2020年12月12日",
DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println("解析本地日期:"+parse);
// 解析本地日期:2020-12-12
System.out.println("======================");
// 解析本地时间
LocalTime parse2 = LocalTime.parse("03:32:05", DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println(parse2);
// 03:32:05