Java8新特性(四)------日期API

Java8新特性(四)------日期API

前言

在Java8以前,我们使用时间和日期的时候,一般都是用Date类,Date与其他的辅助运算类,比如Calendar和格式化的DateFormat,这几个类足够完成我们平时的功能要求,但是,这些类最大的一个缺点都是,他们都是线程不安全的.在Java8中,为了解决这个问题,Java8加入了一套全新的日期API,切是线程安全的.本文我们就一起来学习一下这些API.

正文

1. Java7中使用日期格式化

在java中,因为Date和DateFormat等类都是线程不安全的,所以在多线程的情况下,我们可以是用ThredLocal来加锁,实现代码如下:

  1. 创建一个线程安全的时间转换器:

    public class DateFormatThreadLocal {
    	
    	private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
    		protected DateFormat initialValue() {
    			return new SimpleDateFormat("yyyyMMdd");
    		}
    	};
    	
    	public static Date convert(String source) throws Exception {
    		return df.get().parse(source);
    	}
    }
    
    
  2. 接下来就可以使用了:

    	@Test
    	public void testDateFormat() throws InterruptedException, ExecutionException {
    		Callable<Date> tasl = new Callable<Date>() {
    
    			@Override
    			public Date call() throws Exception {
    				return DateFormatThreadLocal.convert("20181210");
    			}
    		};
    		
    		//使用线程池用多线程来访问
    		ExecutorService pool = Executors.newFixedThreadPool(10);
    		List<Future<Date>> result = new ArrayList<>();
    		
    		for (int i = 0; i < 10; i++) {
    			result.add(pool.submit(tasl));
    		}
    		
    		for (Future<Date> future : result) {
    			System.out.println(future.get());
    		}
            pool.shutdown();
    	}
    }
    

这是我们以前在多线程的情况下解决方案,现在有了Java8为我们提供的time包中的API,我们就不用那么麻烦的去自己加锁啦!

2. Java8中日期的格式化

在Java8中我们可以使用DateTimeFormatter来构建格式化器,用LocalDateLocalTimeLocalDateTime来创建一个时间对象,他们的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间.使用代码如下:

	@Test
	public void testJava8DateFormat() throws Exception {
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
		
		Callable<LocalDate> tasl = new Callable<LocalDate>() {

			@Override
			public LocalDate call() throws Exception {
				return LocalDate.parse("20181210", dtf);
			}
		};
		
		//使用线程池用多线程来访问
		ExecutorService pool = Executors.newFixedThreadPool(10);
		List<Future<LocalDate>> result = new ArrayList<Future<LocalDate>>();
		
		for (int i = 0; i < 10; i++) {
			result.add(pool.submit(tasl));
		}
		
		for (Future<LocalDate> future : result) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
	}

除了以上的时间类,我们还可以使用Instant来获取和操作时间戳

	@Test
	public void test2() {
		Instant now = Instant.now();//默认获取UTC时区
		System.out.println(now);
		
		//要获取我们自己的时间,我们可以运算一下
		OffsetDateTime atOffset = now.atOffset(ZoneOffset.ofHours(8));
		System.out.println(atOffset);
		
		//获得时间戳
		System.out.println(now.toEpochMilli());
	}

还可以使用Duration来计算两个时间之间的间隔,使用Period来计算两个日期之间的间隔:

	@Test
	public void test3() {
		Instant now = Instant.now();
		
		try {
			Thread.sleep(6000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Instant now2 = Instant.now();
		Duration between = Duration.between(now, now2);
		System.out.println(between.toMillis());//获取两个时间之间的毫秒差
		
		
	}

TemporalAdjuster是时间校准器,可以用来操作日期

DateTimeFormatter用来格式化 时间

在java8中也加入了对时区的支持,带时区的时间分别为:ZonedDate、ZonedTime、ZonedDateTime,其中每个时区都对应着ID.

这些类的详细使用可以参照API.

总结

关于Java8的时间日期的操作使用,就写到这里.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值