Java日期时间——有JDK1.8新特性欧

Java日期时间

0 阅读须知


​ Java的日期时间主要掌握Date、Calendar、SimpleDateFormat、LocalDate、LocalTime、LocalDateTime这几大类,其中LocalDate、LocalTime、LocalDateTime是JDK1.8新出的类,需要特别注意。

单词识记

单词 汉译
leap year 闰年
duration 持续时间;期间
period 一段时间;时期;(人生或国家历史的)阶段,时代;纪
zone id 分区ID
instant 瞬间;片刻;某一时刻

1 Date类


​ Date类主要用来获取日期时间。

方法名称 描述
public Date( ) 获取当前的日期时间对象
public Date(long date) 将时间戳数字转为Date类对象
public long getTime( ) 将日期时间以long数据类型的形式返回
public boolean after(Date when) 是否在指定的日期时间之后
public boolean before(Date when) 是否在指定的日期时间之前

2 Calendar类


​ calendar类属于抽象类型,主要用来对日期时间的运算。

方法名称 描述
public static Calendar getInstance( ) 获取Calendar对象
public int get(int field) 获取成员结构的日期或时间数据
public void set(int field,int value) 设置指定成员结构的数据内容
public abstract void add(int field,int amount) 在指定成员结构上进行加法计算

3 SimpleDateFormat类


​ 对日期进行格式化或将字符串转为日期,存在如下匹配表达式:

年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SSS)
方法名称 描述
public SimpleDateFormat(String pattern) 实例化SimpleDateFormat类对象,并设置匹配模式
public final String format(Date date) 将日期格式转换为字符串
public Date parse(String source) throws ParseException 将字符串转换为日期

注意:使用parse将字符串转为日期存在线程安全问题,而使用format将日期转为字符串不存在线程安全问题。

 //date-->String:线程安全
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
String cur_time = sdf.format(date);
System.out.println(cur_time);

//String-->date:线程不安全
String time="2020/02/26 14:35:47:819";
try {
    Date cur_date = sdf.parse(time);
    System.out.println(cur_date);
} catch (ParseException e) {
    e.printStackTrace();
}

​ 拓展形式转换:
Java日期时间——有JDK1.8新特性欧_第1张图片

4 JDK1.8新特性—LocalDate、LocalTime、LocalDateTime


类型 描述
LocalDate 处理日期类
LocalTime 处理时间类
LocalDateTime 处理日期时间类

代码实现如下:

/**
*1. LocalDate常用方法
*/
LocalDate today = LocalDate.now();//获取当前日期
System.out.println(String.format("[当前日期]%d-%d-	         %d",today.getYear(),today.getMonthValue(),today.getDayOfMonth()));
System.out.println("[今天所处一月的周数]"+today.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
System.out.println("[今天所处一年的周数]"+today.get(ChronoField.ALIGNED_WEEK_OF_YEAR));
System.out.println("[今天所处一年的天数]"+today.getDayOfYear());

LocalDate past = LocalDate.parse("1998-10-13");//获取1998-10-13
System.out.println("[1998年是否是闰年]"+past.isLeapYear());
System.out.println("[1998-10-13星期几]"+past.getDayOfWeek());
System.out.println("[1998-10-13所在月的第一天]"+past.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("[1998-10-13所在月的第二天]"+past.withDayOfMonth(2));
System.out.println("[1998-10-13所在月的最后一天]"+past.with(TemporalAdjusters.lastDayOfMonth()));
System.out.println("[1998-10-13之后18年]"+past.plusYears(18));
System.out.println("[1998-10-13之前18个月]"+past.plusMonths(-18));
System.out.println("[1998-10-13所在月的第一个周一]"+past.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));

/**
*2. LocalDateTime与Date、String的转换
*/
//设置匹配表达式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss-SSS");
//获取当前时区
ZoneId zoneId = ZoneId.systemDefault();

//Date-->LocalDateTime-->String:线程安全
Date date= new Date();
LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(),zoneId);//Date-->LocalDateTime
String string_datetime = dateTime.format(formatter);
System.out.println("[LocalDateTime-->String]"+string_datetime);

//String-->LocalDateTime-->Date:线程安全
LocalDateTime localDateTime = LocalDateTime.parse(string_datetime,formatter);
Instant instant = localDateTime.atZone(zoneId).toInstant();//获得当前时区的实例
Date d = Date.from(instant);//字符串转为日期
System.out.println("[String-->LocalDateTime-->Date]"+d);

5 总结


​ LocalDate、LocalTime、LocalDateTime相对于Date、Calendar更加安全而且api更加丰富,对日期时间的操作更加容易,非常值得一试。

​ 不断提升自我,迭代自我,我是猿同学~~~

你可能感兴趣的:(JavaSE学习笔记)