java8时间类常用api


这是根据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

本地日期

之前的都是在时间戳上面的操作,现在我们把时间放到我们熟悉的日期上面来。(具体看代码再对照我的讲解应该好一点)

  1. 本地日期函数LocalDate ,其的初始化也是now、of
  2. 在java8新增的时间类中,计算加上多少天,减去多少小时等问题都有很简单的见名知意的方法如减去一天:minusDays(1)
  3. 其中getDayOfYear()方法是得到对于这一年的多少天。
  4. 比较时间可以用isBefore、isAfter方法,也可以用自己的比较方法(条条大路通罗马)
  5. 本地日期就是我们电脑上的日期,不用转时区。

初始化

//		获取当前日期
		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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值