在java中有很多有关日期时间操作的类,这些类之间有什么关系和区别呢?首先,来了解一下它们之间的继承结构。
一、java.util.Date
构造方法
public Date()//当前时间
public Date(long date)//参数date是自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
常用方法
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
3. "yyyy-mm-dd" 形式的日期的 String
转换为Date对象: 如果给定日期不是 转义形式 (yyyy-mm-dd)会抛IllegalArgumentException
public static Date valueOf(String s)
2.与父类一样拥有setTime()和getTime()方法。
三、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获取到的只有时间。
六、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