java.util.Date类对象的创建:
直接new对象就是创建代表系统当前日期的Date对象
Date d = new Date();
System.out.println(d); //Thu May 07 22:35:17 CST 2020
如果我们想创建一个代表2020年5月7日的Date对象,
Date d1 = new Date(2020-1900, 5-1, 7);
System.out.println(d1); // Thu May 07 00:00:00 CST 2020
可以看到Date为我们提供了相应的构造方法Date(int year, int month, int day),但是这三个参数却不能直接输入我们想要得到的年月日,第一个参数应该是期望年份减去1900的值,第二个参数应该是期望月份减去1的值,第三个参数可以直接输入日数。
上面我们可以看到如果Date对象直接打印,会是Thu May 07 22:35:17 CST 2020这种格式,并不是我们平时所见到的年月日格式化的格式,我们可以借助工具类SimpleDateFormat 格式化Date对象
/*
* 从date转换成String
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println(date); //Thu May 07 22:35:17 CST 2020
//Date-->String
String str = sdf.format(date);
System.out.println(str); //2020-05-07 22:48:16
/*
* String转换为Date对象
*/
String str = "2017-05-05 19:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String-->Date
Date date = sdf.parse(str); // 需要抛出异常
System.out.println(date); //Fri May 05 19:00:00 CST 2017
Calendar类的功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。而且在实现方式上也比Date类要复杂一些。
java.util.Calendar;
日历类,是一个抽象类,定义了针对某一种日期历法的相关操作,有很多子类实现,最常用的就是阳历历法:
GregorianCalendar
Calendar提供了静态方法来获取一个当前系统所在地区适用的日历实现类;大部分地区返回的也都是阳历历法
Calendar类是一个抽象类,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。
Calendar c = Calendar.getInstance(); //默认是当前日期(在中国获取的是阳历历法对象)
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2020年5月7日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2020, 5-1, 7);//调用:public final void set(int year,int month,int date)
System.out.println(c1); //java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=128,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=10,HOUR_OF_DAY=22,MINUTE=57,SECOND=43,MILLISECOND=478,ZONE_OFFSET=28800000,DST_OFFSET=0]
/*
* Calendar 直接实现的toString不能直观的反映时间
* 我们直接打印出来乱七八糟一大堆
*/
/*
* Calendar-->Date
* Calendar类提供了getTime()方法,返回对应的Date对象
* Calendar提供了一个方法getTime
* 该方法可以将自身表示的日期时间可以将一个Date对象的形式返回
*/
Date date = calendar.getTime();
System.out.println(date); //Fri May 07 23:08:41 CST 2020
/*
* Date-->Calendar
* void setTime(Date date)
* Calendar提供了方法setTime,可以将给定的Date对象传入,以使得
* 当前Calendar表示给定Date所表示的日期
*/
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar); //当前时间的Date对应的Calendar对象
* 用户输入一个日期,然后根据一系列的计算。最后把得出的日期显示给用户
* 例如:
* 用户输入一个日期和保质期,输出过期的日期
* 流程
* 1.用户输入一个日期,和其他信息,
* 2.将用户输入的日期(字符串)通过SimpleDateformat转化为Date
* 3.将date 转化为calendar,经过有一系列的计算
* 4.Calendar在转化为date
* 5.date再转化为SimpleDateFormat字符串
* 6.输出给用户
获取时间某一分量的方法get()
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);-------------年
int mouth = calendar.get(Calendar.MONTH)+1;---月
int day = calendar.get(Calendar.DATE);-----------日
System.out.println(year+"-"+mouth+"-"+day);
int dow = calendar.get(Calendar.DAY_OF_WEEK);-----------周几(周日是1
String[] data = {"日","一","二","三","四","五","六"};
System.out.println("周"+data[dow-1]);
int max = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
(获取一月最后一天的方法)
System.out.println("这个月有"+max+"天");
/*
* 计算三年零2个月25天以后是哪天?
* add()方法用来设置时间(加法)
*/
calendar.add(Calendar.YEAR, 3);
calendar.add(Calendar.MONTH, 2);
calendar.add(Calendar.DAY_OF_YEAR , 25);
System.out.println(calendar.getTime());
l、判断是否是闰年
/**
* 给定一个年份判断该年份是否为闰年
*/
public static boolean isLeapYear(int year) {
GregorianCalendar calendar = new GregorianCalendar();
return calendar.isLeapYear(year);
}
2、获取当前日期的字符串表示形式
/**
* 利用SimpleDateFormat获取当前日期的字符串表示形式 格式:2009-5-05
*/
public static String getCurrentDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(System.currentTimeMillis());
}
3、给出任意一个年月日得到该天是星期几
/**
* 给出任意一个年月日得到该天是星期几
*/
public static int getWeek(String date) {
// 注意参数的大小写格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
try {
Date d = dateFormat.parse(date);
c.setTime(d);
} catch (ParseException e) {
}
return c.get(Calendar.DAY_OF_WEEK)-1;
}
4、 获得今天n天以后或者n天以前是那一天
/**
* 获得距离今天n天的那一天的日期
*/
public static String getDistanceDay(int day) {
Calendar calen = Calendar.getInstance();
calen.add(Calendar.DAY_OF_MONTH, day);
Date date = calen.getTime();
// 这里也个用SimpleDateFormat的format()进行格式化,然后以字符串形式返回格式化后的date
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(date);
}
5、 获得距离指定日期n天的那一天的日期
/**
* 获得距离指定日期n天的那一天的日期
*/
public static String getDistanceDay(String date, int day) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date d;
Calendar c =Calendar.getInstance();
try {
d = dateFormat.parse(date);
c.setTime(d);
c.add(Calendar.DATE, day);
} catch (ParseException e) {
e.printStackTrace();
}
return dateFormat.format(c.getTime());
}
6、获得给定两个日期相差的天数
/**
* 获得给定两个日期相差的天数
*
*/
public static long getGapDays(String date1, String date2) {
String[] d1 = date1.split("-");
String[] d2 = date2.split("-");
Calendar c = Calendar.getInstance();
c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer
.parseInt(d1[2]), 0, 0, 0);
long l1 = c.getTimeInMillis();
c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer
.parseInt(d2[2]), 0, 0, 0);
long l2 = c.getTimeInMillis();
return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));
}