Java中Jdk8之前和之后日期时间相关的比较

引入:日期时间的运用无非就是获取、设置、修改、字符串解析与格式转换这些,以下仅从这几方面进行分析比较

        在8之前,我们用到的是Date、SimpleDateFormat、Calendar这三个类。

        在这三个类中,Date只用来获取时间和用毫秒值对时间进行简单操作,想要直接定位到某个时间点是很难做到的,除非知道毫秒值。

//创建时间对象,无参是当前时间
Date date = new Date();
 
//获取当前时间毫秒值
long timeMillis = System.currentTimeMillis();
//设置日期对象的时间为参数毫秒值对应的时间
Date date1 = new Date(timeMillis - 3600 * 1000);
 
//获取指定date对应的毫秒数
long time = date.getTime();
//设置日期对象的毫秒值,用于修改日期对象
date.setTime(timeMillis - 3600L *24*1000*30*12);

        虽然Calendar类能做到指定时间,但是其只能初始化当前时间,然后再对时间各项一一设置,较为麻烦,且如果想要进行解析和格式化操作,需要先将其转变为Date类。

// 创建日历对象  将当前时间的所有信息变量都放入对象中
Calendar calendar = Calendar.getInstance();
// 修改日期中的某个项
calendar.set(Calendar.YEAR,2021);
// 为某个信息增加/减少指定的值
calendar.add(Calendar.MONTH,12);
// 获取日历中指定信息 年\月\日
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
// 获取时间毫秒值
long timeInMillis = calendar.getTimeInMillis();
// 获取时间对象,变成Date可用格式化操作
Date time = calendar.getTime();

        SimpleDateFormat类作为日期格式必要的类,却是独立出去的。想要对日期解析或格式化操作,只能调用其中的方法,日期是作为参数进行转换的。

//创建简单日期格式化对象, 参数为想要的格式
SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date date = new Date();
//将当前时间对象格式化成目标格式的字符串
String s = form.format(date);
//把字符串时间解析成日期对象
Date date1 = form.parse(s);

        综上:先用Calendar设置时间,再转为Date,最后用SimpleDateFormat的方法进行格式化操作。简单的日期操作,却要用到三个对象的方法来回转换,对于初学者并不友好。增加编写难度。

        接着探讨8之后的,用到的是LocalDate、LocalTime、LocalDateTime,DateTimeFormatter,ZoneId、ZonedDateTime这么多的类。

        这个看上去很多,但看过之后不难发现, LocalDate、LocalTime、LocalDateTime 这三者的方法基本一致,第三个是前两个的总和,它们分别是对日期、时间、日期+时间进行操作,根据需要取用对应的类即可,相对于8以前,操作更加精细化。在这几个类中,我们可以直接初始化需要的时间,且对时间的某项获取、修改、判断都有对应的方法。相当于8之前的Date和Calendar的结合,编写更加便利。

// 两种方式创建LocalDateTime
LocalDateTime now = LocalDateTime.now(); //当前时间
LocalDateTime of = LocalDateTime.of(2000, 6, 6, 6, 6); //设置的时间
 
// 使用LocalDateTime获取LocalDate和LocalTime
LocalDate localDate = now.toLocalDate(); //转换成一个LocalDate对象
LocalTime localTime = now.toLocalTime(); //转换成一个LocalTime对象
 
// 获取年月日等
int year = now.getYear(); //年
int month = now.getMonthValue(); //月
int day = now.getDayOfMonth(); //日
int hour = now.getHour(); //时
int minute = now.getMinute(); //分
int second = now.getSecond(); //秒
 
// 直接修改某个信息,返回新日期对象:
// withYear、withMonth、withDayOfMonth、withDayOfYear
LocalDateTime newTime = now.withYear(2023); //修改年份为2023
// 把某个信息加多少,返回新日期对象: 
// plusYears、plusMonths、plusDays、plusWeeks
LocalDateTime lt1 = now.plusYears(10).plusMonths(1);
// 把某个信息减多少,返回新日期对象:
// minusYears、minusMonths、minusDays,minusWeeks
LocalDateTime lt2 = now.minusYears(10); //减少10年
 
// 判断两个日期对象,是否相等,在前还是在后
now.equals(of); //false 不相等
now.isBefore(of); //false now在后,of在前
now.isAfter(of); //true

        DateTimeFormatter类 基本只用来创建需要的格式。具体的转换,在日期类中也有相应的方法,我们只需将创建出的格式模板作为参数传进去即可。

//初始化DateTimeFormatter对象
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();//当前时间
 
//当前时间进行格式化
String str = now.format(dtf);
 
//将时间字符串,解析为LocalDateTime对象
String time = "2024-06-15 15:57:39";
LocalDateTime dateTime = LocalDateTime.parse(time, dtf);

        ZoneId、ZonedDateTime类是增加的对时区的操作,如果有对时区操作的需求,则不需要上面的三种,在ZonedDateTime中也有查看修改等一系列方法,且方法与前面一致。

//获取所有的时区
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
//获取系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
//指定一个时区对象
ZoneId zoneId1 = ZoneId.of("Asia/Tokyo");
//获取指定时区的ZonedDateTime对象
ZonedDateTime now = ZonedDateTime.now(zoneId1);

        综上:对时间操作,只需要在LocalDate、LocalTime、LocalDateTime、ZonedDateTime 这些中选用一个,就能完成所有的日期操作。功能丰富操作简便

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值