java 中日期时间的整理

目录

1、Date类

2、Calendar类

 常用的一些方法:

1>判断是否是闰年:能被4整除且不能被100整除,或能被400整除为闰年

2> 获得今年有多少天

3>判断今天是星期几

4>获取当前 年/月/周/日

5>获取当月最大和最小的一天

6>计算两个日期之间相差的天数

7>距离当天日期 100 天的日期

8>获取某一日期区间的日期

3、DateFormat类和SimpleDateFormat类

4、日期类对象之间的互转


1、Date类

JDK1.8 源码,Date 类定义了解一下:

public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{
    private static final long serialVersionUID = 7523967970034938905L;
    private transient long fastTime;
    private static final BaseCalendar gcal = CalendarSystem.getGregorianCalendar();

    public Date() {
        this(System.currentTimeMillis());
    }

    public Date(long date) {
        fastTime = date;
    }
}

创建一个时间对象有多个构造函数,目前 JDK1.8 仅推荐俩种:

Date date = new Date(); // 获得一个 System.currentTimeMillis() 值

Date date = new Date(long date);

// long date 该整数的值代表的是距离格林尼治标准时间(1970年1月1日0时0分0秒)的毫秒数,

就是说fastTime值为1000的时候代表时间为1970年1月1日0时0分1秒。

2、Calendar类

现在关于日期使用最多的也就是该类,Calendar 要比Date强大很多,而且不需要考虑时区转化问题。

JDK1.8 源码,Calendar 类定义了解一下:

public abstract class Calendar implements Serializable, Cloneable, Comparable<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;
    public final static int HOUR = 10;
    public final static int HOUR_OF_DAY = 11;
    public final static int MINUTE = 12;
    public final static int SECOND = 13;
    public final static int MILLISECOND = 14;
    public final static int ZONE_OFFSET = 15;
    public final static int DST_OFFSET = 16;
    public final static int FIELD_COUNT = 17;
    public final static int SUNDAY = 1;
    public final static int MONDAY = 2;
    public final static int TUESDAY = 3;
    ...
    public final static int JANUARY = 0;
    public final static int FEBRUARY = 1;
    public final static int AM = 0;
    public final static int PM = 1;

    public static Calendar getInstance()
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }

    public static Calendar getInstance(TimeZone zone)
    {
        return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
    }
}

上边是源码中整理出来,可以看出 Calendar 类中有很多静态变量,这些常量将会作为索引用来检索 fields 属性,例如:fields[YEAR]将返回当前毫秒值对应的日期时间的年份部分,fields[MONTH]将返回的是月份部分的值等等。

随便调用我们的日期类,就可以看到其方法内部最后调用 internalGet 对 fields 值进行返回。

Calendar calendar = Calendar.getInstance();
calendar.set(year,month-1,day);

由源码常量定义可知:JANUARY = 0,FEBRUARY = 1...所以月份要 +1 才是当前月份;

上午=0,下午=1;

星期日=1,星期一=2,星期二=3,...

 常用的一些方法:

1>判断是否是闰年:能被4整除且不能被100整除,或能被400整除为闰年

    @Test
	public void isNotLeapYear(){
		int year = 2018;
		GregorianCalendar calendar = new GregorianCalendar();
		System.out.println("判断是否是闰年:"+calendar.isLeapYear(year));
	}

2> 获得今年有多少天

	@Test
	public void yearAllDay(){
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, 2018);
		System.out.println("今年有多少天:"+cal.getActualMaximum(Calendar.DAY_OF_YEAR));
	}

3>判断今天是星期几

	@Test
	public void whatWeek(){
		Date date = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		System.out.println("今天是星期几:"+(c.get(Calendar.DAY_OF_WEEK)-1));//记得减一啊
	}

4>获取当前 年/月/周/日

	@Test
	public void dateYearMonthDay(){
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		//以下四个方法将废弃,推荐下面的获取方式
		//int year = date.getYear()+1900;
		//int month = date.getMonth();
		//int week = date.getDay();
		//int day = date.getDate();
		calendar.setTime(date);
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH)+1;
		int week = calendar.get(Calendar.DAY_OF_WEEK)-1;
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println("year:"+year+"month:"+month+"week:"+week+"day:"+day);
	}

5>获取当月最大和最小的一天

	@Test
	public void dateMaxMinDay(){
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		calendar.setTime(date);
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.set(year, month, day);
		int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("Max Day: " + maxDay);
		int minDay = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
		System.out.println("Min Day: " + minDay);
	}

6>计算两个日期之间相差的天数

	@Test
	public void daysBetween() throws ParseException {
		Date startdate = new Date();
		Date enddate = new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		startdate=sdf.parse(sdf.format(startdate));
		enddate=sdf.parse(sdf.format(enddate));
		Calendar cal = Calendar.getInstance();
		cal.setTime(startdate);
		long time1 = cal.getTimeInMillis();
		cal.setTime(enddate);
		long time2 = cal.getTimeInMillis();
		long between_days=(time2-time1)/(1000*3600*24);
		System.out.println("两个日期之间相差的天数:"+Integer.parseInt(String.valueOf(between_days)));
	}

7>距离当天日期 100 天的日期

	@Test
	public void dateAdd() throws ParseException {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		Date parse = dateFormat.parse("20181126");
		Calendar c =Calendar.getInstance();
		c.setTime(parse);
		c.add(Calendar.DATE, 100);//当前日期增加100天
		//tempStart.add(Calendar.DAY_OF_YEAR, 1);//本年度的日数加一
		String format = dateFormat.format(c.getTime());
		System.out.println("距离当天日期 100 天的日期:"+format);
	}

8>获取某一日期区间的日期

	@Test
	public void dateGap() throws ParseException {
		// 返回的日期集合
		List<String> days = new ArrayList<String>();

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date start = sdf.parse("2018-11-01");
		Date end = sdf.parse("2018-11-23");

		Calendar tempStart = Calendar.getInstance();
		tempStart.setTime(start);
		Calendar tempEnd = Calendar.getInstance();
		tempEnd.setTime(end);

		while (tempStart.before(tempEnd)) {
			days.add(dateFormat.format(tempStart.getTime()));
			tempStart.add(Calendar.DAY_OF_YEAR, 1);//本年度的日数加一
		}
	}

9>

10>

11>

3、DateFormat类和SimpleDateFormat类

JDK1.8 源码:DateFormat.class 

public abstract class DateFormat extends Format {
    private static final long serialVersionUID = 7218322306649953788L;
    protected Calendar calendar;
    protected NumberFormat numberFormat;
    public static final int ERA_FIELD = 0;
    ...
}

JDK1.8 源码:SimpleDateFormat.class 

public class SimpleDateFormat extends DateFormat {
    static final long serialVersionUID = 4774881970558875024L;
    static final int currentSerialVersion = 1;
    private int serialVersionOnStream;
    private String pattern;
    ...
}

这俩个类都是对日期时间进行格式化(如:可以将日期转换为指定格式的文本,也可以将文本转换为日期)

SimpleDateFormat 类是 DateFormat 类(抽象类)的子类 。可以实现自由定制格式类型。

创建 DateFormat 对象:

 DateFormat df = DateFormat.getDateInstance() ;

 df.format(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ; // 格式化日期:Date -转-  String    2018年11月26日

df.parse("2018-11-26") // 格式化日期:String -转-  Date    Mon Nov 26 00:00:00 CST 2018

 创建 SimpleDateFormat 对象:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

sdf.format(new Date()) ; // 格式化日期:Date -转-  String       2018-11-26

sdf.parse("2018-11-26") ; // 格式化日期:String -转-  Date     Mon Nov 26 00:00:00 CST 2018

4、日期类对象之间的互转

以下内容是整理别人的博客,忘记链接了,如有侵权请告知。

简单测试类如下:

@Test
	public void dateTransfer() throws ParseException {
		/************************** Date 与 Calendar 互相转换  begin ***************************************/
		//1.Date 转化为Calendar
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		//2.Calenda转换为Date
		Calendar calendar2 = Calendar.getInstance();
		Date date =calendar2.getTime();
		/*************************** Date 与 Calendar 互相转换  end **************************************/

		/************************** String与 Date 互相转换  begin ***************************************/
		//1.Date 转化String
		SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
		String dateStr=sdf.format(new Date());
		//2.String 转化Date
		String str="2010-5-27";
		Date date2 = sdf.parse(str);
		/*************************** String与 Date 互相转换  end **************************************/

		/************************** Calendar与 Date 互相转换  begin ***************************************/
		//1 .将Calendar对象转换为Date(c.getTime())
		Calendar c = Calendar.getInstance();
		Date d = c.getTime();
		// 2.将Date转换为Calendar对象(s.setTime(date))
		Calendar c1 = Calendar.getInstance();
		Date d1 = new Date();
		c1.setTime(d1);
		/*************************** Calendar与 Date 互相转换  end **************************************/

		/************************** Calendar与Long互相转换  begin ***************************************/
		// 将Calendar对象转换为相对时间
		Calendar c2 = Calendar.getInstance();
		long long1 = c2.getTimeInMillis();
		System.out.println("将Calendar对象转换为相对时间:"+long1);//1543244109740L
		// 将long转换为Calendar对象
		Calendar cal = Calendar.getInstance();
		long long2 = 1252785271098L;
		cal.setTimeInMillis(long2);
		System.out.println("将long转换为Calendar对象:"+long2);//1252785271098
		/*************************** Calendar与Long互相转换  end **************************************/

		/************************** Date与Long互相转换  begin ***************************************/
		//1.将Date类的对象转换为long型时间
		Date date3= new Date();
		long longDate = date3.getTime();
		System.out.println("将Date类的对象转换为long型时间:"+longDate);//:1543243849147L
		//2.将long型时间转换为Date类的对象
		long time = 1543243460536L;
		Date dt = new Date(time);
		System.out.println("使用Date的构造方法完成:"+dt);//Mon Nov 26 22:44:20 CST 2018
		/*************************** Date与Long互相转换  end **************************************/

	}

猜你喜欢

转载自blog.csdn.net/csdn_0911/article/details/84551737
今日推荐