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();
}
拓展形式转换:
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更加丰富,对日期时间的操作更加容易,非常值得一试。
不断提升自我,迭代自我,我是猿同学~~~