java 日期相关类Date,Calendar,DateFormat

参考


图1
图2

一、java.util.Date

常用方法

1.把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 。

public String toString()

其中:

dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat);
zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。
yyyy 是年份,显示为 4 位十进制数。
重写了Object的toString()方法。每次我们打印输出java.util.Date类型的对象时,输出的字符串都不是标准的“2018-09-12 21:09:08”这样的形式,而是这样:

Thu Jan 15 14:51:54 CST 1970

就是因为Date对象调用了它的toString()方法。

2.设置Date对象的时间:

public void setTime(long time)

3.返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

public long getTime()

二、java.sql.Date

为什么要有java.sql.Date这个类呢?

我们发现除了父类Date在util包下,它的三个子类都是在sql包下的。因为在和数据库打交道时(也就是在执行sql语句时),我们要用到sql包下的时间类,其他情况下我们通常用util包下的Date来格式化日期或者得到当前时间。为什么和数据库打交道时不能用java.util.Date?因为PreparedStatement有三个设置时间的方法:setDate()、setTime()、setTimeStamp(),这三个方法的第二个参数分别是java.sql.Date、java.sql.Time和java.sql.TimeStamp,并没有提供参数是java.util.Date的方法。除此之外,ResultSet也有三个get()方法与之对应,且返回的时间类型也是sql包下的这三个类。

构造方法:

public Date(long date)

与它父类的有参构造方法一样。

常用方法:

1.格式化日期转义形式 yyyy-mm-dd 的日期。

public String toString()

重写了父类的toString()方法,只返回日期,不返回时间。当我们打印java.sql.Date类型的对象时,会输出这种形式:

1970-01-15
  1. “yyyy-mm-dd” 形式的日期的 String 转换为Date对象: 如果给定日期不是 转义形式 (yyyy-mm-dd)会抛IllegalArgumentException
public static Date valueOf(String s)

3.与父类一样拥有setTime()和getTime()方法。

 getTime()方法继承自java.util.data

三、java.sql.Time

构造方法

public Time(long time)

常用方法

1.重写了toString()方法,对时间进行格式化,返回 hh:mm:ss 格式的 String。

public String toString()

2.“hh:mm:ss” 格式的时间字符串转换为 Time ,格式错误会抛出异常。

public static Time valueOf(String s)
3.同样拥有getTime()和setTime()

四、java.sql.TimeStamp

构造方法

public Timestamp(long time)

常用方法
1.重写了toString(),返回 yyyy-mm-dd hh:mm:ss.fffffffff 格式的 字符串:

public String toString()

2.将" yyyy-mm-dd hh:mm:ss[.f…] "格式的字符串转换为 Timestamp对象:格式错误会抛异常

public static Timestamp valueOf(String s)

3.同样拥有getTime()和setTime()方法。

五、操作数据库用哪个类

看我们想要保留日期还是时间,如果只想保留日期,那么用java.sql.Date获取,如果只想保留时间,那么用Time获取,如果时间日期都要保留,那么用TimeStamp获取。另外,在简单实体类中,日期属性的类型一般习惯使用java.util.Date,因为它有无参构造,表达当前时间比较方便。所以要写一个工具类来转换sql包下的那三个类和java.util.Date。

示例:用sql包下的三个类分别获取mysql中字段为datetime值为2018-10-03 16:38:53的时间(由于数据库连接代码太多,所以只贴重点代码)

java.sql.Date date=rs.getDate("createDate");
            Date d1=new Date(date.getTime());
            System.out.println(d1);
 
            Time time=rs.getTime("createDate");
            Date d2=new Date(time.getTime());
            System.out.println(d2);
 
            Timestamp ts=rs.getTimestamp("createDate");
            Date d3=new Date(ts.getTime());
            System.out.println(d3);

运行结果:

Wed Oct 03 00:00:00 CST 2018
Thu Jan 01 16:38:53 CST 1970
Wed Oct 03 16:38:53 CST 2018

只有用TimeStamp获取得到的时间才是完整的,Date获取到的只有日期,Time获取到的只有时间。

六、java.text.SimpleDateFormat

SimpleDateFormat是处理Date与String相互转化格式的类。

构造方法(其中一个)

public SimpleDateFormat(String pattern)

参数pattern是描述日期和时间格式的字符串

常用方法

1.将对象格式化为字符串。如果该 SimpleDateFormat 对象不能格式化给定的对象则抛IllegalArgumentException:

public final String format(Object obj)

2.将字符串转换为java.util.Date对象:

public Date parse(String source) throws ParseException

示例:

import java.text.SimpleDateFormat;
import java.util.Date;
 
public class Main {
    public static void main(String[] args) throws Exception {
 
        SimpleDateFormat format=new SimpleDateFormat("yyyy--MM--dd HH:mm:ss");
        String str=format.format(new Date());
        System.out.println(str);
 
        Date d=format.parse(str);
        System.out.println(d);
    }
}

运行结果:

2018--10--06 15:17:03
Sat Oct 06 15:17:03 CST 2018

java.text.SimpleDateFormat: 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

日期和时间模式(注意大小写,代表的含义是不同的):
在这里插入图片描述
例子:

SimpleDateFormat format=new SimpleDateFormat("yyyy--MM--dd HH:mm:ss E D a z");
        String str=format.format(new Date());
        System.out.println(str);

        Date d=format.parse(str);
        System.out.println(d);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date start = format.parse("2020-7-1 12:00:00");
        Date end = format.parse("2020-7-2 12:00:00");
        System.out.print(((end.getTime() - start.getTime()) / 1000 / 60));

运行结果:

1440

七, calendar(抽象类)

## Calendar 类常用方法的记录:

7.1Calendar的实例化方式

首先Calendar是一个抽象类,不能直接实例化,Java提供了静态工厂方法getInstance()来实例化Calendar,或者通过它的子类来实例化

Calendar c=new GregorianCalendar();//直接创建
Calendar c=Calendar.getInstance();//工厂方法

7.2使用calendar的一个示例

// 创建Calendar类对象
		Calendar objCalendar = Calendar.getInstance();
 
		// 显示日期和时间的各个组成部分
		System.out.println("显示日期和时间的各个组成部分:");
		System.out.println("年:" + objCalendar.get(Calendar.YEAR));
		System.out.println("月:" + objCalendar.get(Calendar.MONTH));
		System.out.println("日:" + objCalendar.get(Calendar.DATE));
		System.out.println("小时:" + objCalendar.get(Calendar.HOUR));
		System.out.println("分钟:" + objCalendar.get(Calendar.MINUTE));
		System.out.println("秒:" + objCalendar.get(Calendar.SECOND));
 
		// 当前时间添加30分钟,然后显示日期和时间
		objCalendar.add(Calendar.MINUTE, 30);
		Date objDate = objCalendar.getTime();
		System.out.println("\n当前时间添加30分钟后的日期和时间:");
		System.out.println(objDate);

执行结果:

显示日期和时间的各个组成部分:
年:2020
月:11
日:5
小时:7
分钟:48
秒:17

当前时间添加30分钟后的日期和时间:
Sat Dec 05 20:18:17 CST 2020
获取时间
    // 使用默认时区和语言环境获得一个日历
    Calendar cal = Calendar.getInstance();
    // 赋值时年月日时分秒常用的6个值,注意月份下标从0开始,所以取月份要+1
    System.out.println("年:" + cal.get(Calendar.YEAR));
    System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));       
    System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
    System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));
    System.out.println("分:" + cal.get(Calendar.MINUTE));
    System.out.println("秒:" + cal.get(Calendar.SECOND));

今天是 2018 年 2 月 12 日,运行结果:

:2018:2:12:15:57:39

7.3设置时间

DAY_OF_WEEK一周中的第几天,星期日是第一天
月份的下标从 0 开始,设置时同样需要注意,比如我们设置为 2 月 15 日除夕当晚的倒计时的最后一秒: 2018-02-15 23:59:59
可以这样:

  Calendar cal = Calendar.getInstance();
    // 如果想设置为某个日期,可以一次设置年月日时分秒,由于月份下标从0开始赋值月份要-1
    // cal.set(year, month, date, hourOfDay, minute, second);
    cal.set(2018, 1, 15, 23, 59, 59);

或者也可以单个字段一一设置:

 // 或者6个字段分别进行设置,由于月份下标从0开始赋值月份要-1
    cal.set(Calendar.YEAR, 2018);
    cal.set(Calendar.MONTH, Calendar.FEBRUARY);
    cal.set(Calendar.DAY_OF_MONTH, 15);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    System.out.println(cal.getTime());

打印的时间结果为:

 Thu Feb 15 23:59:59 CST 2018

时间计算
add方法:
比如在除夕当晚最后一秒,add 一秒:

   Calendar cal = Calendar.getInstance();
    System.out.println(cal.getTime());
    cal.set(2018, 1, 15, 23, 59, 59);
    cal.add(Calendar.SECOND, 1);
    System.out.println(cal.getTime());

打印时间结果如下,日期会自动进入下一天:

  Thu Feb 15 23:59:59 CST 2018
    Fri Feb 16 00:00:00 CST 2018

再比如 1 月 31 号的时候,月份加一,会出现怎样结果:

   Calendar cal = Calendar.getInstance();
    cal.set(2018, 1, 31, 8, 0, 0);
    System.out.println(cal.getTime());
    cal.add(Calendar.MONTH, 1);
    System.out.println(cal.getTime());

运行结果:

Wed Jan 31 08:00:00 CST 2018
Wed Feb 28 08:00:00 CST 2018

说明 add 月份时,会将不存在的日期归为当月日历的最后一天。

7.4常用方法:

1.Calendar.getTime():

//返回一个Date对象
Date objDate = Calendar.getTime();

2.Calendar.setTime()

public final void setTime(Date date)

3.获取Calendar的一些私有属性的值

Calendar.get(Calendar.YEAR))
 Calendar.get(Calendar.MONTH))
Calendar.get(Calendar.DATE))
Calendar.get(Calendar.HOUR))
Calendar.get(Calendar.MINUTE))
Calendar.get(Calendar.SECOND))
posted @ 2021-04-07 17:13  木有呂朋友  阅读(100)  评论(0编辑  收藏  举报