常用类解析:时间日期类
前言
之前在使用时间的时候,会用 System.currentMiliis() 这个函数,这个函数返回的是从1970年1月1日00:00开始至今所经历的毫秒数 long类型,拿到这个毫秒数 就可以进行换算年、月、日、星期。但是有专门计算时间和日期的类:
java.util.Date
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
java.text.DateFormat
java.text.SimpleDateFormat
java.util.Calendar
一、时间和日期的类
1. 关于java.util.Date(方法大多数已过时)
java.util.Date 是 java.sql.Date 和 java.sql.Time 和 java.sql.Timestamp 的父类,也是Java中的时间标准库,表示的是一个特定的瞬间从1970年1月1日00:00开始至今所经历的毫秒数,内部进行计算来获取具体的时间参数年、月、日、时 、分、秒;但是从JDK1.1(JDK8-JDK1.8)开始,推荐使用Calendar这个类来表示时间。
2. 关于java.text.DataFormat
java.text.DataFormat 是一个抽象类,表示的是时间/日期格式化类,也可以进行时间的提取和时间的转换时间字符串解析出具体的时间,具体的时间转换成字符串表现形式。
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。
DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。
DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。
3. 关于java.text.SimpleDateFormat
java.text.SimpleDateFormat 是 DataFormat 的实现子类,功能和DataFormat一样,但是会有更加丰富的操作。
对于格式化参数:
-
y 年 yyyy年-2021年
-
M 月 MM月-11月
-
d 日 dd日-06日
MM yyyy dd E a
- 08 2021 16 monday AM -
E 星期 E-星期日
-
a 上下午 a-PM/AM
-
H 小时(24小时制)
-
h 小时(12小时制)
HH:mm:ss
- 11:13:58 -
m 分钟
-
s 秒
4. 关于java.util.Calendar抽象类
用于封装日历信息(包含时间),其主要作用在于其方法可以对时间分量进行运算(基于当前时间的偏移)。
二、关于时间的操作主要分为如下几个大类
1. 时间日期获取
可以从Date类里面直接获取,或者从SimpleDateFormat里面规定格式进行格式化毫秒或者date都可以获取。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDemo01 {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);//默认规定的
//过时 千年时间虫 不推荐使用
System.out.println(date.getHours());
System.out.println(date.getYear());
System.out.println(date.getDay());
System.out.println(date.getMonth());
System.out.println("==============");
//自己重新指定写一个 格式化类
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(System.currentTimeMillis());//毫秒值按照规定的格式转
String time2 = df.format(date);//date对象
System.out.println(time);
System.out.println(time2);
}
}
2. 日期转换
(1)日期转字符串、字符串转日期
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TimeDemo02 {
public static void main(String[] args) throws ParseException {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//日期转字符串
Calendar calendar = Calendar.getInstance();//获取当前时间
Date date = calendar.getTime();//通过Calendar类获取的,获取当前的时间对象
// Date getTime() 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
String s1 = sdf.format(date);//格式化 String format(Date date)将一个 Date 格式化为日期/时间字符串。
System.out.println(s1);
//字符串解析日期
String s2 = "2021-8-24 22:19:35";
Date date2 = sdf.parse(s2);
// Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期。
System.out.println(date2);
}
}
(2)字符串转时间,用Calendar来获取详细的内容。
public final static int ERA = 0;
public final static int YEAR = 1;
public final static int MONTH = 2;
public final static int WEEK_OF_YEAR = 3;
public final static int WEEK_OF_MONTH = 4;
public final static int DATE = 5;
public final static int DAY_OF_MONTH = 5;
public final static int DAY_OF_YEAR = 6;
public final static int DAY_OF_WEEK = 7;
public final static int DAY_OF_WEEK_IN_MONTH = 8;
public final static int AM_PM = 9;
…
后面还有很多用常量来表示,便于我们来获取所要的;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TimeDemo03 {
public static void main(String[] args) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");//多态 本质是SimpleDateFormat子类
Date date = df.parse("2021年8月16日 14时16分52秒");//解析
Calendar cal = df.getCalendar();//解析之后获得一个日历对象
System.out.println(cal.getTime());//把日历对象打印出来
//getTime()底层返回的是 return new Date(getTimeInMillis()); Date类型
//获取当前日历时间 Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR); //获取年
int month = cal.get(Calendar.MONDAY); //获取月
int day = cal.get(Calendar.DATE); //获取日
int hour = cal.get(Calendar.HOUR); //获取时
int minute = cal.get(Calendar.MINUTE);//获取分
int second = cal.get(Calendar.SECOND); //获取秒
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);//一周中的第几天
int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);//一年中的第几天
System.out.println(year + " " + month + " " + day);//month从0(一月)算的
System.out.println(hour + " " + minute + " " + second);
System.out.println(dayOfWeek);
System.out.println(dayOfYear);
}
}
(3)获取当前时间,显示 :下午、下午
import java.text.DateFormat;
import java.util.Date;
public class TimeDemo04 {
public static void main(String[] args) {
Date date = new Date();
//有Date就要日期,Time就是时间
//年 月 日 ----- 2021-8-24
DateFormat df1 = DateFormat.getDateInstance();
System.out.println(df1.format(date));
//年 月 日 时 分 秒 ----- 2021-8-24 22:41:27
DateFormat df2 = DateFormat.getDateTimeInstance();
System.out.println(df2.format(date));
//时 分 秒 ----- 22:41:27
DateFormat df3 = DateFormat.getTimeInstance();
System.out.println(df3.format(date));
//2021年8月24日 星期二 下午10时41分27秒 GMT+08:00 DateFormat.FULL全显示
DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
System.out.println(df4.format(date));
//2021年8月24日 下午10时41分27秒 DateFormat.LONG
DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(df5.format(date));
//21-8-24 下午10:41 DateFormat.SHORT
DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);
System.out.println(df6.format(date));
//2021-8-24 22:41:27 DateFormat.MEDIUM
DateFormat df7 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);
System.out.println(df7.format(date));
}
}
3. 日期加减
以某一个日期为基准 计算几天前/后…
(1)获取当前时间的前一年时间,add() 方法;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class TimeDemo05 {
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
print(now);
now.add(Calendar.YEAR,1); //是现在时间的1年后
print(now);
now.add(Calendar.YEAR,-1); //是现在时间的1年前
print(now);
now.add(Calendar.HOUR,-1);
print(now);
Calendar specialDate = Calendar.getInstance();
specialDate.setTimeInMillis(System.currentTimeMillis() / 2);
print(specialDate);
specialDate.add(Calendar.YEAR,-1000);
print(specialDate);
}
//重写一个打印格式
private static void print(Calendar cal) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(cal.getTime()));
}
}
结果:
(2)根据时间然后对小时、分钟、秒进行相加;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class TimeDemo06 {
public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE , -30);//30分钟前
String s = df.format(nowTime.getTime());
System.out.println(s);
}
}
结果:
(3)计算2017年1月1日距离现在多少天;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class TimeDemo07 {
public static void main(String[] args) throws ParseException, ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-01-01 14:52:30";
Calendar calendar = Calendar.getInstance();
long nowDate = calendar.getTime().getTime(); //获取当前时间的毫秒值
long specialDate = sdf.parse(dateString).getTime(); //获取指定日期的毫秒值
long betweenDate = (nowDate - specialDate) / (1000 * 60 * 60 * 24);//计算间隔多少天
System.out.println(betweenDate);
}
}
结果:
(4)求两个日期 相差多少小时、分钟、秒;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDemo08 {
public static void main(String[] args) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = df.parse("2021-08-16 15:18:23");
Date d2 = df.parse("2021-08-17 17:45:32");
long nd = 1000 * 24 * 60 * 60; //一天多少毫秒
long nh = 1000 * 60 * 60; //一小时多少毫秒
long nm = 1000 * 60; //一分钟多少毫秒
long ns = 1000; //一秒多少毫秒
long diff = d2.getTime() - d1.getTime();
//计算差多少天
long day = diff / nd;
//计算差多少小时
long hour = diff % nd / nh;
//计算差多少分钟
long minute = diff % nd % nh / nm;
//计算差多少秒
long second = diff % nd % nh % nm / ns;
System.out.println(day + " " + hour + " " + minute + " " + second);
}
}
结果:
4. 日期比较
一种是通过before和after比较,或者compareTo来比较。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDemo09 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2021-08-16 11:11:11";
String dateString2 = "2021-08-17 11:11:11";
Date date1 = sdf.parse(dateString1);
Date date2 = sdf.parse(dateString2);
System.out.println(date1.before(date2));
System.out.println(date1.after(date2));
System.out.println(date1.compareTo(date2));
}
}
结果: