java 日期相关类Date,Calendar,DateFormat
文章目录
一、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
- “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(抽象类)
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))