1、介绍
日期时间类在Java开发中是必不可少的,前后端如何传递时间参数、数据库的时间在Java中对应什么类型、Java中时间转换的各种方式有哪些?
2、Date类
Date类是JDK1.0时期推出来的第一代时间类,位于java.util
包下,是最常用的方式是对获取当前时间,使用SimpleDateFormat
对时间进行格式化。
Date now = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowStr = simpleDateFormat.format(now);
Date对象中也有一系列API用于获取年份、月份、星期、时、分、秒等信息,但是大多数都已不推荐使用:
在使用SimpleDateFormat
格式化Date类时还需要注意线程安全问题,因为SimpleDateFormat
是线程不安全的,一般不要定义为static类型:
public class Demo {
final static SimpleDateFormat YYY_MM_DD_HH_MM_SS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
Date date = null;
try {
date = YYY_MM_DD_HH_MM_SS.parse("2023-01-29 09:09:09");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date);
}).start();
}
}
}
3、Calendar类
Calendar类是JDK1.1时期推出时间类,位于java.util
包下,用来替换Date中获取年份、月份、星期、时、分、秒等时间元素的API,使用相对Date类来说相对简单:
//基于当前时间获得Calendar实例
Calendar calendar = Calendar.getInstance();
System.out.println("年:" + calendar.get(Calendar.YEAR));
// 初始月份是从0开始
System.out.println("月:" + (calendar.get(Calendar.MONTH)+1));
System.out.println("日:" + calendar.get(Calendar.DATE));
System.out.println("小时(24时制):" + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("小时(12时制):" + calendar.get(Calendar.HOUR));
System.out.println("分钟:" + calendar.get(Calendar.MINUTE));
System.out.println("秒:" + calendar.get(Calendar.SECOND));
System.out.println("毫秒:" + calendar.get(Calendar.MILLISECOND));
System.out.println("今年的第几周:" + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("这个月的第几周:" + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("年内第几天:" + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("月内第几天:" + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("周内第几天:" + calendar.get(Calendar.DAY_OF_WEEK));
/**
*
* final Date getTime(); //获得Calendar实例对应的Date对象
* final void setTime(Date date); //使用Date实例初始化Calendar对象
*
*/
Calendar类的出现并没有替换掉Date类,它更像是对Date类的增强。可能Date类并不好用,所以出现了很多第三方的时间库,比如joda time
。
4、LocalDateTime类
JDK1.8对日期时间类做了一次大的更新,joda time
库的作者也参与到了其中。这一版的时间类功能强大全面,使用简单,且解决了之前的线程安全性问题,推荐使用。
JDK1.8在java.time
包下新增了大量的时间处理类,新增了许多常用的API操作,如日期时间的比较、加减、格式化等等,Instant、LocalDate、LocalTime、LocalDateTime
是几个常用的时间类。
Instant:提供了一个高精度的时间戳。
//基于当前时间获得Instant实例
Instant now = Instant.now();
//毫秒时间戳,和System.currentTimeMillis()效果一致
long epochMilli = now.toEpochMilli();
//秒级时间戳
long epochSecond = now.getEpochSecond();
LocalDate:是一个不可变的日期对象,表示日期,不包含时分秒。
//基于当前时间获得LocalDate实例
LocalDate now = LocalDate.now();
System.out.println(now);//2023-01-29
System.out.println(now.getYear());//获取年 2023
System.out.println(now.getMonth().getValue());//获取月 1
System.out.println(now.getDayOfMonth());//获取当前月第几天 29
/**
* LocalDate实例其它常用方法:
*
* public LocalDate plusDays(long daysToAdd):添加指定天数。
* public LocalDate plusMonths(long monthsToAdd):添加指定月数。
* public LocalDate plusWeeks(long weeksToAdd):添加指定周数。
* public LocalDate plusYears(long yearsToAdd):添加指定年数。
* public LocalDate minusDays(long daysToSubtract):减少指定天数。
*/
LocalTime:是一个不可变的时间对象,表示时间(时分秒),不包年月日。
//基于当前时间获得LocalTime实例
LocalTime now = LocalTime.now();
System.out.println(now);//14:51:47.264
System.out.println(now.getHour());//获取时 14
System.out.println(now.getMinute());//获取分 51
System.out.println(now.getSecond());//获取秒 47
LocalDateTime:是一个不可变的日期时间对象,表示日期时间,包含年月日时分秒(使用较多)。
//基于当前时间获得LocalDateTime实例
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2023-01-29T15:06:44.353
/**
* 时间格式化使用新增的类
*
* DateTimeFormatter:是一个线程安全的时间格式化类。
*/
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowStr = dateTimeFormatter.format(now);//2023-01-29 15:06:44
long milli = now.toInstant(ZoneOffset.of("+8")).toEpochMilli();//获取东8区(北京时间)毫秒级时间戳
long second = now.toEpochSecond(ZoneOffset.of("+8"));//获取东8区(北京时间)秒级时间戳
5、对应数据库
在数据库中,时间类型有date、datetime、time、timestamp
,在Java中分别使用什么类型映射接收。
date
类型使用LocalDate
接收。time
类型使用LocalTime
接收。datetime
类型使用LocalDateTime
接收。timestamp
类型使用LocalDateTime
接收。