jdk8新特性-日期时间

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接收。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值