Java中常见的时间日期类

Date类

在整个JAVA程序的设计过程之中,日期时间是一个非常重要的话题,同时几乎所有的项目开发都不可能离开日期时间的处理操作,而整个Java里面对于日期时间也提供有一系列的工具类供开发者使用。
java.util.Date 类是Java之中获得日期时间的最简单的程序类,这个类可以通过直接实例化Date类对象的形式获取当前的日期时间。
范例:获取当前的日期时间

import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
		System.out.println(new Date());
	}
}

执行结果:Wed Apr 15 10:43:00 CST 2020
Date里面给出的日期时间默认格式采用的是外国人的习惯,所以中国的人民肯定不习惯,但是他已经包含有正确的信息,如果想进行更加详细的处理,后面会有专门的类。除了以上的构造方法之外,在Date类里也提供有如下的方法:

NO方法名称类型描述
01public Date()普通获取当前的日期时间对象
02public Date(long Date)普通将时间戳数字转转为Date类对象
03public long getTime()普通将时间日期以long数据类型的形式返回
04public boolean after(Date when)普通是否在指定日期时间之后
05public boolean before(Date when)普通是否在指定日期时间之前

在Java程序里面,时间日期(毫秒数)、内存大小、文件大小都是用long数据类型进行描述的。在Date里面可以通过接受一个long时间日期的数字,也可以通过Date返回一个long的数据。如果想要清楚的理解Date类之中连个构造之间彼此的关系,最佳的做法还是要浏览一下Date类构造方法的源代码。
无参构造

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

单参构造

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

所谓的无参构造方法实际上会自动进行单参构造方法的调用,并且传递的参数是System类之中所获得的“当前时间日期的数值”,下面首先研究一下long与Date类对象之间的转换。
范例:观察long与Date类对象之间的转换

import java.util.Date;

public class DateDemo {
    public static void main(String[] args)throws Exception {
		long fastTime = System.currentTimeMillis()-10000;//得到long数据类型
    	Date dateA = new Date(fastTime);//日期时间数值小
    	Date dateB = new Date();//日期时间数值大
		System.out.println(dateA);//long转Date类型
    	System.out.println(dateB);
    	System.out.println("【两个日期时间相差的毫秒数】"+(dateB.getTime()-dateA.getTime()));
    	System.out.println("【先后关系】 AFTER:"+dateA.after(dateB));
    	System.out.println("【先后关系】 BEFORE:"+dateA.before(dateB));
	}
}

执行结果:
Wed Apr 15 12:01:41 CST 2020
Wed Apr 15 12:01:51 CST 2020
【两个日期时间相差的毫秒数】10001
【先后关系】 AFTER:false
【先后关系】 BEFORE:true

通过此时的程序代码的执行我们可以得到如下两个重要信息:时间日期可以转换为long类型、Date类可以实现时间日期先后顺序的判断。

SimpleDateFormat类

通过之前的对比可以发现使用Date类获取日期时间要比使用Calendar类获取日期时间更加的简单(Calendar类的功能不在于日期的获取,而在于日期的计算),可是通过Date获取的日期时间实在是不方便阅读。所以在实际的开发之中会存在一种格式化日期的处理操作,而这种操作主要依靠与“java.text.SimpleDateFormat”类来完成。
在这里插入图片描述
这个类有如下重要的操作方法:

NO方法名称类型描述
1public SimpleDateFormat(String pattern)普通实例化SimpleDateFormat对象并设置匹配模式
2public final String format(Date date)普通将日期格式化为字符串
3public Date parse(String source)普通将字符串转换为日期

如果想要成功的对日期进行格式化或将字符串转变为日期,则必须存在一个日期时间的匹配表达式,而这组表达式里面最重要的几个时间单位是年(yyyy),月(MM),日(dd),时(HH),分(mm),秒(ss),毫秒(SSS)
范例:格式化日期时间(将Date转换为String)

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args)throws Exception {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//实例化转换对象
		System.out.println(sdf.format(date));
	}
}

执行结果:2020-04-15 14:45:26.011
这个时候所获得的日期时间的字符串信息就非常符合国人的习惯了,采用类似的表达式,也可使实现字符串转为日期的处理。
范例:字符串转日期时间(将String转换为Date)
以后只要进行项目开发的过程里面,当进行数据输入的时候全部的数据都是字符串类型,那么我们就需要依据目标的需求进行数据类型的转换,这样的转换操作的机制非常常见。

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args)throws Exception {
		String str = "2020-04-15 14:45:26.011";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//实例化转换对象
		Date date = sdf.parse(str);
		System.out.println(date);
	}
}

执行结果:Wed Apr 15 14:45:26 CST 2020
【扩充】数据类型之间的转换
在这里插入图片描述

Calendar类

在整个Java里面虽然Date类可以描述时间日期,但是实际上除了时间日期之外还会有许多与日历有关的操作,例如:需要知道某一个日期所在月的最后一天,或者判断某一个日期是否处于闰年,对于这些繁琐的日期操作处理,在JAVA里就可以使用一个Calendar程序类来完成相应的操作。首先观察一下Calendar的基本定义:

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>

发现Calendar类属于一个抽象类,那么按照原来的概念理解的话,那么应该通过子类进行该类对象的实例化。而通过JavaDoc文档可以发现有一个“GregorianCalendar”的子类,但是这个时候观察一下Calendar类中提供的方法。

NO方法名称类型描述
1public static Calendar getInstance();普通获取Calendar类的对象实例
2public int get(int field);普通获取成员结构的日期或事件数据
3public void set(int field,int value);普通设置指定成员结构的数据内容
4public abstract void add(int field,int amount);普通在指定结构上进行加法计算

Calendae类之中的两个构造方法都使用了protected的访问权限,则意味着这两个构造方法只能被同一包及不同包的子类访问。所以如果想要获得本类对象最佳的做法是就是通过getInstance()的方法完成。
在这里插入图片描述
【范例】:通过Calendar类获取日期时间

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
    	Calendar calendar = Calendar.getInstance();//获取Calendar类实例对象
    	System.out.println(String.format("当前的时间日期:%s-%s-%s %s::%s::%s",
    			calendar.get(Calendar.YEAR),
    			calendar.get(Calendar.MONTH)+1,
    			calendar.get(Calendar.DAY_OF_MONTH),
    			calendar.get(Calendar.HOUR_OF_DAY),
    			calendar.get(Calendar.MINUTE),
    			calendar.get(Calendar.SECOND)));
	}
}

执行结果:
当前的时间日期:2020-4-15 13::54::59
在使用Calendar进行时间日期数值获取的时候一般都需要进行补0处理,但是获取当前的日期时间并不是Calendar类的主要作用,这个类主要用于日历的计算。
【范例】:实现日期的准确计算

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
    	Calendar calendar = Calendar.getInstance();//获取Calendar类实例对象
    	calendar.add(Calendar.YEAR, 30);//计算30年之后的日期
    	calendar.add(Calendar.MONTH, 6);//计算半年之后的日期
    	System.out.println(String.format("当前的时间日期:%s-%s-%s %s::%s::%s",
    			calendar.get(Calendar.YEAR),
    			calendar.get(Calendar.MONTH)+1,
    			calendar.get(Calendar.DAY_OF_MONTH),
    			calendar.get(Calendar.HOUR_OF_DAY),
    			calendar.get(Calendar.MINUTE),
    			calendar.get(Calendar.SECOND)));
	}
}

执行结果:
当前的时间日期:2050-10-15 14::2::52
如果此时没有采用这样的结构进行日期类的计算处理,而是采用long进行计算,那么得到的日期时间一定是不准确的。既然Calendar描述的是一个日期结构,就可以考虑一些日期上的调用。
【范例】:找到8月的最后一天

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
    	Calendar calendar = Calendar.getInstance();//获取Calendar类实例对象
    	calendar.set(calendar.get(Calendar.YEAR), 8,1);//通过9月计算8月的最后一天
    	calendar.add(Calendar.DAY_OF_MONTH,-1);
    	System.out.println(String.format("当前的时间日期:%s-%s-%s %s::%s::%s",
    			calendar.get(Calendar.YEAR),
    			calendar.get(Calendar.MONTH)+1,
    			calendar.get(Calendar.DAY_OF_MONTH),
    			calendar.get(Calendar.HOUR_OF_DAY),
    			calendar.get(Calendar.MINUTE),
    			calendar.get(Calendar.SECOND)));
	}
}

执行结果:
当前的时间日期:2020-8-31 14::12::47
如果想要进行指定日期最后一天的计算,则就应该定位到指定日期上,然后再利用一些加减操作获取日期数据,由于本程序需要找到8月的最后一天,那么就将日期定位到9月的第一天,然后利用add方法在天数上进行减1的操作,就变为了8月的最后一天。

LocalDate类

在JDK1.8之后的版本中,Java追加了一个新的日期时间的处理包,在这个包中提供有三个主要类型:LocalDate、LocalTime、LocalDateTime。可以通过这些类型更简单的进行日期、时间或日期时间的处理,相比较之前的Calendar类来讲,这些类的使用更加的方便。
范例:获取当前的日期时间

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class LocalDateDemo {
    public static void main(String[] args)throws Exception {
		LocalDate localDate = LocalDate.now();//获取当前日期
		LocalTime localTime = LocalTime.now();//获取当前时间
		LocalDateTime localDateTime = LocalDateTime.now();//获取当前日期时间
	    System.out.println("【LocalDate实例化输出】"+localDate);
	    System.out.println("【localTime实例化输出】"+localTime);
	    System.out.println("【localDateTime实例化输出】"+localDateTime);
    }
}

执行结果:
【LocalDate实例化输出】2020-04-15
【localTime实例化输出】15:24:50.711
【localDateTime实例化输出】2020-04-15T15:24:50.711

通过本程序代码可以发现,每一个日期时间里面都会存在有一个now()方法,这个方法可以获得当前系统的日期时间,并且输出这些对象都可以得到非常明确的信息内容。
在java.time包中最为重要的一个类就要属于LocalDate类,这个类除了可以直接利用对象的toString()方法获取时间之外,也可以针对年、月、日等数据分开处理。
范例:通过LocalDate获取详细的日期数据

import java.time.LocalDate;
import java.time.temporal.ChronoField;

public class LocalDateDemo {
    public static void main(String[] args)throws Exception {
		LocalDate today = LocalDate.now();//获取当前日期
		System.out.println(String.format("当前日期:%s年%s月%s日",
				today.getYear(),today.getMonthValue(),today.getDayOfMonth()));
        System.out.println("【今天是一周的第几天】"+today.getDayOfWeek().getValue());
        System.out.println("【本周是一月的第几周】"+today.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
        System.out.println("【本周是一年的第几周】"+today.get(ChronoField.ALIGNED_WEEK_OF_YEAR));
        System.out.println("【今天是一年的第几天】"+today.getDayOfYear());
    }
}

执行结果:
当前日期:2020年4月15日
【今天是一周的第几天】3
【本周是一月的第几周】3
【本周是一年的第几周】16
【今天是一年的第几天】106

同样都属于日期的处理,但明显感觉到通过LocalDate要比通过Calendar类处理更加简单,实际上使用LocalDate还可以非常方便地判断出某一个日期所在的年是否为闰年。
范例:通过LocalDate判断日期是否在闰年

import java.time.LocalDate;

public class LocalDateDemo {
    public static void main(String[] args)throws Exception {
		LocalDate localDate = LocalDate.parse("1998-01-03");
		System.out.println("【闰年判断】"+localDate.isLeapYear());
    }
}

执行结果:【闰年判断】false
在使用LocalDate类进行日期处理的时候,最为强大的功能时可以直接进行日期的计算处理,例如:获得所在月的第一天或是最后一天等。
范例:通过LocalDate进行日期推算

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class LocalDateDemo {
    public static void main(String[] args)throws Exception {
		LocalDate localDate = LocalDate.parse("1998-12-13");
		System.out.println("【所在月的第一天】"+localDate.with(TemporalAdjusters.firstDayOfMonth()));
		System.out.println("【所在月的第二天】"+localDate.withDayOfMonth(2));
		System.out.println("【所在月的最后一天】"+localDate.with(TemporalAdjusters.lastDayOfMonth()));
		System.out.println("【300年后的日期】"+localDate.plusYears(300));
		System.out.println("【300月后的日期】"+localDate.plusMonths(300));
		System.out.println("【日期所处月的第一个周一】"+localDate.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
		System.out.println("【日期所处年的第一个周一】"+LocalDate.parse("1998-01-03").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
    }
}

执行结果:
【所在月的第一天】1998-12-01
【所在月的第二天】1998-12-02
【所在月的最后一天】1998-12-31
【300年后的日期】2298-12-13
【300月后的日期】2023-12-13
【日期所处月的第一个周一】1998-12-07
【日期所处年的第一个周一】1998-01-05

通过以上一系列的操作之后可以发现,在进行日期数据的处理上,实际上使用LocalDate类要比直接使用Calendar类更加简单,同时这个类也属于新时代的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值