java时间相关类详解(Date类,Calendar类,LocalDate类,时间格式化,时间戳)

5,790 阅读5分钟

这是我参与更文挑战的第4天,活动详情查看: 更文挑战

常用时间类有Date,Calendar,LocalDate,SimpleDateFormat,时间戳等等。

Date类及其方法

在这里插入图片描述 使用new Date() 创建时,如图,忽略sun.util包,创建Date 主要是util包和sql包两种方式; 使用的是idea编辑器,可通过快捷键ctrl+h 查看类关系,如下图,sql.Date类继承于util包。 在这里插入图片描述

1)使用java.util 创建

在这里插入图片描述 Date主要使用无参构造和long类型创建,其余已过时。

Date date = new Date();
//接收一个 long 类型的参数,该参数是从 1970-01-01 00:00:00.000 到当前时间的毫秒数
Date date2 = new Date(1574673617000L);
System.out.println(date);
System.out.println(date2);
//显示结果,默认时间格式如下
Mon Nov 25 17:20:59 CST 2019
Mon Nov 25 17:20:17 CST 2019

date主要方法 在这里插入图片描述

  • compareTo
//使用上面创建的date和date2
System.out.println(date.compareTo(date2));
System.out.println(date2.compareTo(date));
System.out.println(date2.compareTo(new Date(1574673617000L)));
//显示结果如下
//将需要比较的日期和括号内日期相比较
1  //括号内日期比前面日期小
-1 //括号内日期比前面日期大
0  //两日期相等
  • clone
Object clone = date.clone();
  • getTime
//获取时间毫秒数
long time = date.getTime();
System.out.println(date.getTime());
  • after,before
//判读时间前后
boolean before = date.before(date2);
boolean after = date.after(date2);
  • toInstant
Instant instant = date.toInstant();
System.out.println(instant);
//显示标准时间,时区相差8
2019-11-25T09:55:27.543Z
  • from
Date from = Date.from(instant);
System.out.println(from);

下面一些过时方法,使用Clandar类方法代替了 在这里插入图片描述

2)使用java.sql 创建

在这里插入图片描述 发现sql包下的Date类没有无参构造方法,使用util包的Date注入一个long类型的date

 Date date = new Date(new java.util.Date().getTime());
 System.out.println(date);
//显示结果,日期格式如下,说明sql包的Date类重写了toString 方法,没有了详细时间
2019-11-25

在这里插入图片描述 sql包下的Date类继承于util包的Date,方法基本一致,sql包的Date只有日期,适用于sql,一般使用util包就行。

  • toLocalDate()
//转换成LocalDate
 LocalDate localdate = date.toLocalDate();

java sql.date和util.date区别

不同点

  1. java.sql.date是针对sql使用的,只有日期部分,没有时间部分

  2. java.util.date是java.sql.date的父类

之间的转换关系

  java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());

Calendar类

Calendar是一个抽象类不能像Date类直接通过new创建。通过内部的getInstance方法创建。

Calendar instance = Calendar.getInstance();
System.out.println(instance);
//显示结果,默认toString比较复杂
java.util.GregorianCalendar[time=1574735939207,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=26,DAY_OF_YEAR=330,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=38,SECOND=59,MILLISECOND=207,ZONE_OFFSET=28800000,DST_OFFSET=0]

常用方法如下 在这里插入图片描述

  • compareTo
//和Date类方法类似,返回值
1  //括号内日期比前面日期小
-1 //括号内日期比前面日期大
0  //两日期相等
int i = instance.compareTo(Calendar.getInstance());
  • getTime
//返回Date类
Date time = instance.getTime();
System.out.println(time);
  • get ==重要方法==
//传入Calendar类定义的常量,返回对应信息
int i1 = instance.get(Calendar.DAY_OF_WEEK);
int i2 = instance.get(Calendar.DAY_OF_MONTH);
System.out.println(i1);
System.out.println(i2);
//
3
26
  • setTime
//设置时间,传入Date类型
instance.setTime(new Date());
  • set
//设置时间,通过Calendar常量
instance.set(Calendar.YEAR,2019);
instance.set(Calendar.MONTH,11);
//直接设置,后面还可以接时分秒
instance.set(2019,11,26);

新日期类LocalDate,LocalTime,LocalDateTime

前面sql包Date类的toLocalDate()方法,就是将其转换成新日期类。

Java 8新增了LocalDate和LocalTime接口,方法更加实用。 java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。 Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。

构造方法私有了,通过内置的now()方法新建

LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
//显示如下
2019-11-26
13:57:57.440
2019-11-26T13:57:57.440

常用方法 在这里插入图片描述

格式化日期,SimpleDateFormat

  • Date格式化 ==SimpleDateFormat.parse()方法将String转为Date==
 Date date = new Date();
 System.out.println(date);
  //使用SimpleDateFormat,自定义格式
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String format = dateFormat.format(date);
  System.out.println(format);
  //转化后是String,将String 转换成Date
  try {
      Date parse = dateFormat.parse(format);
  } catch (ParseException e) {
      e.printStackTrace();
  }
//显示如下
Tue Nov 26 15:00:04 CST 2019
2019-11-26 15:00:04
Tue Nov 26 15:00:04 CST 2019
  • Calendar格式化
//getTime方法将Calendar转换成Date后在格式化
 Calendar instance = Calendar.getInstance();
 Date date = instance.getTime();
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 String format = dateFormat.format(date);
 System.out.println(format);
  • LocalDate格式化
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
//显示如下
2019-11-26
15:15:23.722
2019-11-26T15:15:23.722

格式化 localDate 自带format()方法,需要传参DateTimeFormatter

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String format = date.format(dateTimeFormatter);
System.out.println(format);
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("HH:mm:ss");
String format2 = time.format(dateTimeFormatter2);
System.out.println(format2);
//显示如下
20191126
16:08:52

时间戳(timestamp)

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

  • 获取当前时间戳
 //获取时间戳,单位毫秒
 long l = System.currentTimeMillis();
  System.out.println(l);
  //
  Date date = new Date();
  long time = date.getTime();
  System.out.println(time);
  //
  long timeInMillis = Calendar.getInstance().getTimeInMillis();
  System.out.println(timeInMillis);
  • 时间戳转日期
//Date构造可直接转换
Date date1 = new Date(1574758172536L);
System.out.println(date1);