Java:Date类、Calendar类、java.time包的简单介绍,收藏他,就对了!!!

    技术2024-11-02  24

    文章目录

    Date类Date构造器Date类的方法Date类的实例 Calendar类Calendar对象的创建Calendar与DateCalendar类的方法set()方法的延迟修改 java.time包java.time包下的常用类Clock类Duration类Instant类LocalDate类LocalTime类LocalDateTime类MonthDay类Year类YearMonth类ZoneId类ZoneDateTimeDayOfWeek类Month类 代码示范 结语

    这日子呀真是过完一天就会少一天,那我们一生到底有多少个日子呢?如果不清楚,那么就让我们来了解一下__Java__当中的__时间、日期类__吧日期时间类在Java开发中得到了广泛的应用,今天有我这个帅气又迷人的大帅锅“thadqy”来给大家讲一讲这个时间、日期类吧!

    Date类

    Java给我们提供了Date类来处理时间以及日期。大家要注意哦,这儿的Date类是在__java.util包下__,而不是__java.sql包下的Date类__。

    Date构造器

    Date类给我们提供了六个构造器。不过,Java官方已经不再推荐其中的4个;如果使用不再推荐的构造器编译器会发出警告,还会影响程序性能和安全方面等。下面是仅剩的两个构造器:

    Date() :改构造器代表生成当前时间的Date对象。并且,再底层调用了System.currentTimeMillis()以获得Long类型的日期参数

    Date date1 = new Date(); System.out.println(date1); //Fri Jul 03 16:53:55 CST 2020

    Date(long date) :根据指定的long类型整数生成Date对象。构造器参数表示创建的Date对象与GMT1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位

    Date date2 = new Date(56354646); System.out.println(date2); //Thu Jan 01 23:39:14 CST 1970

    Date类的方法

    与Date类的构造器一样,它的方法大部分也已经过时。下面就是位数的几个方法:

    boolean after(Date when) :测试该日期是否在指定日期when之后

    Date date3 = new Date(System.currentTimeMillis() + 10); Date date4 = new Date(); System.out.println(date3.after(date4)); //true

    boolean before(Date when) :测试改日期是否在指定日期when之前

    Date date1 = new Date(); Date date3 = new Date(System.currentTimeMillis() + 10); System.out.println(date1.before(date3)); //true

    long getTime() :返回改时间与GMT 1970年1月1日00:00:00之间的时间差,返回long类型的以毫秒为单位的时间

    Date date = new Date(); long timeMillis = date.getTime(); System.out.println(timeMillis + " ms"); //1593767166696 ms

    void setTime(long time) :设置改Date对象时间

    Date date = new Date(); long timeMillis = date.getTime(); Date date5 = new Date(); date5.setTime(timeMillis); System.out.println(date5); //Fri Jul 03 17:16:16 CST 2020

    Date类的实例

    public class DateTest(){ public static void main(String[] args){ Date date1 = new Date(); // 获取当前时间 Date date2 = new Date(System.currentTimeMillis() + 10); // 获取当前时间后的10秒 System.out.println("当前时间:" + date1); System.out.println("当前时间后的10秒:" + date2); System.out.println(date1.compareTo(date2)); System.out.println(date1.after(date2)); } } //输出结构为: //当前时间:Fri Jul 03 17:22:33 CST 2020 //当前时间后的10秒:Fri Jul 03 17:22:33 CST 2020 //-1 //false

    总的来说,Java提供的Date类是一个对操作时间、日期并不高效、方便的类。因此Java官方并不推荐使用Date类。但是,如果你需要对时间、日期进行加减运算,获取指定的年、月、日、时、分、秒等信息应该怎么办呢?

    不要慌张!!!,考虑到Date类的糟糕设计,又出现了Calendar工具类。我们可以使用Calendar类来完成一些Date类完不成的任务。

    Calendar类

    Calendar本身是一个抽象类,它是所有的日历类的模板,并提供一些所有日历通用的方法。Java给我们提供了一个Calendar的子类Gregorian Calendar类,他就是我们通常所说的公历。

    Calendar对象的创建

    因为Calendar是一个抽像类,所有Calendar不能用构造器来创建。但是Calendar提供了几个静态方法来获取Calendar类。如,getInstance()。

    Calendar与Date

    Calendar与Date都是用来表示时间日期的工具类。所以,Calendar与Date类是可以自由转换的。如下所示:

    //创建Calendar对象 Calendar calendar = Calendar.getInstance(); //从Calendar对象中取出Date对象 Date date = calendat.getTime(); //通过Date获取Calendat对象,因为Calendar类没有构造函数可以接受Date对象,所以必须先获取Calendar实例,然后再通过setTime()方法 Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date);

    Calendar类的方法

    void add(int field, int amount) :为给定的日历字段添加或减去指定的时间量

    //给当前日期减去5天 Calendar calendar = Calendar.getInstance(); System.out.println("当前日期为:" + calendar.getTime()); //减去5天 calendar.add(calendar.DAY_OF_MONTH, -5); System.out.pringln("当前日期减去5天为:" + calendar.getTime()); //当前日期为:Fri Jul 03 17:57:44 CST 2020 //当前日期减去5天为:Sun Jun 28 17:57:44 CST 2020

    void roll(int field, int amount) :与add()方法类是,但是有一点不同,就是roll再amount后如果超过最大值,也不会向上一位进位

    Calendar calendar = Calendar.getInstance(); calendar.set(2020, 7, 3, 18, 13, 25); System.out.println(calendar.getTime()); calendar.roll(calendar.MONTH, 6); System.out.println(calendar.getTime()); //Mon Aug 03 18:13:25 CST 2020 //Mon Feb 03 18:13:25 CST 2020+

    int getActualMaximum(int field) :返回指定日历字段的最大值。例如月,最大值为11

    int maxMonth = calendar.getActualMaximum(calendar.MONTH); System.out.println("月份最大为:" + maxMonth); //月份最大为:11

    int getActualMinimum(int field) :返回指定日历字段的最小值。例如,月,最小值为0

    int miniMonth = calendar.getAtualMinimum(calendar.MONTH); System.out.println("月份最小为:" + miniMonth); //0

    int get(int field) :返回指定日历字段的值

    Calendar c = Calendar.getInstance(); int day = c.get(c.DAY_OF_MONTH); System.out.println("当前为"+day+"日"); //当前为3日

    void set(int field, int value) :将给定的日历字段设置为给定的值

    Calendar c1 = Calendar.getInstance(); c1.set(c1.MONTH, 11); System.out.println(c1.get(c1.MONTH)); //11

    void set(int field, int month, int date) : 设置Calendar对象的年月日

    Calendar c12 = Calendar.getInstance(); c12.set(2000, 7, 20); System.out.println(c12.getTime()); //Sun Aug 20 22:10:36 CST 2000

    void set(int field, int month, int date, int hourofDay, int minute, int second) :设置Calendar对象的年月日时分秒

    Calendar c = Calendar.getInstance(); c.set(2000, 8, 20, 7, 25, 0); System.out.println(c.getTime()); //Wed Sep 20 07:25:00 CST 2000

    set()方法的延迟修改

    Calendar类的set()方法在修改时具有延迟效果。这主要是因为:Calendar在修改字段时并没有立即修改,而是使用成员变量表将修改值记录下来。因此,Calendar类在修改时并未进行真实值的计算。下面举一个简单的例子:

    public class LazyTest{ public static void main(String[] args){ Calendar cal = Calendar.getInstance(); cal.set(2000, 7, 31); // 2000年8月31日 //将月份修改为9月 //如果立即修改,系统将会自动把cal调为10月1日 cal.set(cal.MONTH, 8); System.out.println(cal.getTime()); // ① //设置DATE字段为5 cal.set(cal.DATE, 5); // ② System.out.println(cal.getTime()); // ③ } } 在上面的代码中我们运行后得到输出结果为: Sun Oct 01 22:32:06 CST 2000 __Thu Oct 05 22:32:06 CST 2000__ 但是,当我们将第①行的代码注释掉后,我们在运行,就会发现得出的结果为: __Tue Sep 05 22:38:45 CST 2000__ 在这儿我们明显看到,结果是不一样的,这就是Calendar类的set()方法修改延迟带来的后果

    在Java 8以后有新增了一个日期、时间包。这个包的出现又给我们操作日期、时间数据提供了遍历。那么接下来,就继续来看看这个__java.time包__下有什么神奇的方面。

    java.time包

    java.time包包含了几个常用的类。下面就来看看这类吧。

    java.time包下的常用类

    Clock类

    该类的实例用于查询当前时刻,可以使用储存的时区来解释当前时刻。同时,可以使用该类替代System.currentTimeMillis()方法和TimeZone.getDefault()。并且提供了跟多的方法来获取当前日期、时间。这个类是抽象类和不可变的,同时也是线程安全的。

    Duration类

    该类代表持续时间,可以非常方便的获取一段时间。这个类是不可变的,同时也是线程安全的。

    Instant类

    该类在时间线上建立单个瞬时点。这可能用于应用程序中记录事件的时间戳。该类提供了静态方法now()来获取当前时刻。提供静态方法now(Clock clock)方法来获取clock对象的时刻。同时还有minusXxx()方法在当前时刻的基础上减去一段时间,也提供了plusXxx()方法在当前时刻的基础上加上一段时间。

    LocalDate类

    是一个不可变的日期时间对象,表示日期,通常是年月日。例如,值”2000年8月20日“可储存在LocalDate。该类不储存或表示时间或时区。它是日期的描述,用于生日。该类提供了静态方法now()获取当前日期提供了now(Clock clock)静态方法来获取clock对应的日期。还提供了minusXxx()、plusXxx()等方法在其日期基础上进行减、加

    LocalTime类

    这个类是线程安全且不可变的该类代表一个时间,通常看作小时、分、秒,时间精度为纳秒。该类引用相等时,应使用equals()方法该类提供了静态方法now()获取当前时间提供了now(Clock clock)静态方法来获取clock对应的时间该类提供了minusXxx()方法在当前年份的基础上减去几小时、几分钟、几秒提供了plusXxx()方法在当前年份的基础上加上几小时、几分钟、几秒

    LocalDateTime类

    该类是一个不可变的日期时间对象,代表日期时间,通常被视为年月日时分秒。时间精度为纳秒。例如,值“2000年8月20日12:45:123456789”可以储存在LocalDateTime该类引用相等时,应使用equals()方法这个类是线程安全且不可变的该类提供了静态方法now()获取当前时间提供了now(Clock clock)静态方法来获取clock对应的时间该类提供了minusXxx()方法在当前年份的基础上减去几年、几月、几日、几小时、几分钟、几秒提供了plusXxx()方法在当前年份的基础上加上几年、几月、几日、几小时、几分钟、几秒

    MonthDay类

    该类代表月日, 例如,04-12使用静态方法now()、now(Clock clock)获取当前月日、和clock对象对应的月日

    Year类

    该类仅代表年, 例如,2000使用静态方法now()、now(Clock clock)获取当前月日、和clock对象对应的年份使用minusYears()方法在当前年份的基础上减去几年使用plusYears()方法在当前年份的基础上加上几年

    YearMonth类

    该类仅代表年月, 例如,2000-08使用静态方法now()、now(Clock clock)获取当前月日、和clock对象对应的年月使用minusXxx()方法在当前年份的基础上减去几年、几月使用plusXxx()方法在当前年份的基础上加上几年、几月

    ZoneId类

    该类代表一个时区

    ZoneDateTime

    该类代表一个时区化的日期、时间

    DayOfWeek类

    这是一个枚举类,定义了周日到周六的枚举值

    Month类

    这是一个枚举类,定义了一月到十二月的枚举值

    下面就用一个简单的程序来示范这些用法

    代码示范

    public class NewDatePackageTest{ publc static void main(String[] args){ // 获取当前Clock Clock clock = Clock.systemUTC(); // 通过Clock获取当前时刻 Instant nowTime = clock.instant(); System.out.println("当前时间为:" + nowTime); // 获取clock对应的毫秒数,与System.currenTimeMillis()输出相同 long millis = clock.millis(); System.out.println("clock对应的毫秒数为:" + millis); System.out.println(System.currentTimeMillis()); System.out.println("关于Duration的用法"); Duration d = Duration.ofSeconds(6000); System.out.println("6000相当于" + d.toMinutes() + "分"); System.out.println("6000相当于" + d.toHours() + "小时"); System.out.println("6000相当于" + d.toDays() + "天"); // 在clock基础上增加6000秒,返回新的Clock Clock clock2 = Clock.offset(clock, d); // 可以看到clock2与clock相差1小时40分钟 System.out.println("当前时刻加6000秒为:" + clock2.instant()); System.out.println("关于Instant用法"); // 获取当前时间 Instant instant1 = Instant.now(); System.out.println("当前时间为:" + instant1); // instant新增6000秒,返回新的Instant Instant instant2 = instant1.minusSeconds(6000); System.out.println("insatnt1增加6000秒为:" + instant2); // 根据字符串解析Instant对象 // Instant instant3 = Instant.parse("2014-02-23T10:12:35.3422"); // System.out.println(instant3); System.out.println("关于LocalDate的方法"); // 获取当前年月日 LocalDate localDate = LocalDate.now(); System.out.println("当前日期为:" + localDate); // 获取2014年的第146天 localDate = LocalDate.ofYearDay(2014, 146); System.out.println("2014年第146天日期为:" + localDate); // 将日期设置为2014年5月21日 两种方法任选其一 // localDate = LocalDate.of(2014, 5, 21); localDate = LocalDate.of(2014, Month.MAY, 21); System.out.println("设置日期为:" + localDate); System.out.println("关于LocalTime的方法"); // 获取当前时间 LocalTime localTime = LocalTime.now(); System.out.println("当前时间为:" + localTime); // LocalDate ld = LocalDate.now(); // System.out.println(ld.toString() + " "+ localTime.toString()); // 设置为22点30分 localTime = LocalTime.ofSecondOfDay(5503); System.out.println(localTime); System.out.println("关于LocalDateTime的用法"); // 获取当前日期、时间 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("当前时间为:" + localDateTime); // 当前时间加上25小时3分钟 LocalDateTime future = localDateTime.plusHours(25).plusMinutes(3); System.out.println("当前时间加上25小时3分钟为:" + future); System.out.println("关于Year、YearMonth、MonthDay"); // 获取当前年份 Year year = Year.now(); System.out.println("当前年份为:" + year); // 当前年份再加5年 year = year.plusYears(5); System.out.println("当前年份再加5年为:" + year); // 根据指定当年的月份获取YearMonth YearMonth yearMonth = year.atMonth(10); System.out.println("根据指定当年的月份获取YearMonth为:" + yearMonth); // 当前年月再加5年、减3个月 yearMonth = yearMonth.plusYears(5).minusMonths(3); System.out.println("当前年月再加5年、减3个月为:" + yearMonth); // 获取当前月日 MonthDay monthDay = MonthDay.now(); System.out.println("获取当前月日为:" + monthDay); // 设置为5月23日 MonthDay monthDay2 = MonthDay.of(5, 23); System.out.println("将当前日期设置为5月23日:" + monthDay2); } } //输出结果为: //关于Clock的用法 //当前时间为:2020-07-03T15:38:58.283744800Z //clock对应的毫秒数为:1593790738327 //1593790738327 //关于Duration的用法 //6000相当于100分 //6000相当于1小时 6000相当于0天 //当前时刻加6000秒为:2020-07-03T17:18:58.330218700Z //关于Instant用法 //当前时间为:2020-07-03T15:38:58.330537400Z //insatnt1增加6000秒为:2020-07-03T13:58:58.330537400Z //关于LocalDate的方法 //当前日期为:2020-07-03 //2014年第146天日期为:2014-05-26 //设置日期为:2014-05-21 //关于LocalTime的方法 //当前时间为:23:38:58.385770200 //01:31:43 //关于LocalDateTime的用法 //当前时间为:2020-07-03T23:38:58.385770200 //当前时间加上25小时3分钟为:2020-07-05T00:41:58.385770200 //关于Year、YearMonth、MonthDay //当前年份为:2020 //当前年份再加5年为:2025 //根据指定当年的月份获取YearMonth为:2025-10 //当前年月再加5年、减3个月为:2030-07 //获取当前月日为:--07-03 //将当前日期设置为5月23日:--05-23

    结语

    今天关于Java的日期、时间类的介绍就到这里啦!多谢客官的支持。本人学识有限,万望大家海涵。同时对于文中有误之处,也希望大家之处。

    Processed: 0.016, SQL: 9