Java菜鸟笔记:Java中的Date类以及时间日期格式化

22 篇文章 0 订阅
16 篇文章 0 订阅

一、 Date类

java.util.Date类对象的创建:

1、创建当前时间的Date对象

直接new对象就是创建代表系统当前日期的Date对象

Date d = new Date();
System.out.println(d);   //Thu May 07 22:35:17 CST 2020

2、创建指定的时间的Date对象:

如果我们想创建一个代表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的值,第三个参数可以直接输入日数。

3、Date输出为格式化的String

上面我们可以看到如果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类

Calendar类的功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。而且在实现方式上也比Date类要复杂一些。
java.util.Calendar;
日历类,是一个抽象类,定义了针对某一种日期历法的相关操作,有很多子类实现,最常用的就是阳历历法:
GregorianCalendar
Calendar提供了静态方法来获取一个当前系统所在地区适用的日历实现类;大部分地区返回的也都是阳历历法

Calendar类是一个抽象类,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

创建一个代表系统当前日期的Calendar对象

Calendar c = Calendar.getInstance(); //默认是当前日期(在中国获取的是阳历历法对象)

创建一个指定日期的Calendar对象

使用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

/*
 * Date-->Calendar
 * void setTime(Date date)
 * Calendar提供了方法setTime,可以将给定的Date对象传入,以使得
 * 当前Calendar表示给定Date所表示的日期
 */
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar);            //当前时间的Date对应的Calendar对象

三、Date,SimpleDateFormat,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));

}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪力乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值