Java日期工具类使用

时间戳概念

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起之现在的总秒数,本质是一个long类型的整数,表示日期对象。Java体系的时间戳是毫秒。

public class Timechuo {
    public static void main(String[] args) {
        long t=System.currentTimeMillis();
        System.out.println(t);    //输出时间戳
        System.out.printf("%tF %<tT%n",0L);//格式化时间戳-格林威治时间(中国)
        System.out.printf("%tF %<tT%n",t);//格式化时间戳
    }
}
运行结果:
1676080307174
1970-01-01 08:00:00
2023-02-11 09:51:47

java.util.Date

Date类的无参数构造方法获取的是系统当前的时间,显示的顺序为星期、月、日、小时、分、秒、年。
Date类标识系统特定的时间戳,可以精确到毫秒。Data对象表示的默认顺序是星期、月、日、小时、分、秒、年。
Data类有如下两个构造方法:
Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫
秒),使用该构造方法创建的对象可以获取本地的当前时间。
Date(long date):此种形式表示从 GMT 时间(格林威治时间)1970 年 1 月 1 日 0 时 0 分 0
秒开始经过参数 date 指定的毫秒数。

Date d1=new Date();
        Date d2=new Date(System.currentTimeMillis());
        Date d3=new Date(1676081510116l);//指定时间戳
        System.out.println(d2);
        //格式化
        System.out.printf("%tF %<tT%n",d1);
        System.out.printf("%tF %<tT%n",d2);
        System.out.printf("%tF %<tT%n",d3);

        //常用方法
        long now=d1.getTime();
        System.out.println(now);//当前时间戳
        d1.setTime(now+(1000*60*60*24*10));//十天后的时间
        System.out.printf("%tF %<tT%n",now);//当前时间
        System.out.printf("%tF %<tT%n",d1);//十天后的时间
 运行结果:
Sat Feb 11 10:39:57 CST 2023
2023-02-11 10:39:57
2023-02-11 10:39:57
2023-02-11 10:11:50
1676083197622
2023-02-11 10:39:57
2023-02-21 10:39:57
Date date1 = new Date(); // 调用无参数构造函数   注:要手动导包
        System.out.println(date1.toString()); // 输出:Sat Feb 11 09:37:30 CST 2023
        Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
        System.out.println(date2); // 输出格林威治时间(中国)+60000毫秒后的时间:Thu Jan 01 08:01:00 CST 1970
   运行结果:
   Sat Feb 11 09:37:30 CST 2023
   Thu Jan 01 08:01:00 CST 1970

Date 类的无参数构造方法获取的是系统当前的时间,显示的顺序为星期、月、日、小时、分、秒、
年。
Date 类带 long 类型参数的构造方法获取的是距离 GMT 指定毫秒数的时间,60000 毫秒是一分
钟,而 GMT(格林尼治标准时间)与 CST(中央标准时间)相差 8 小时,也就是说 1970 年 1 月 1 日
00:00:00 GMT 与 1970 年 1 月 1 日 08:00:00 CST 表示的是同一时间。 因此距离 1970 年 1 月 1 日
00:00:00 CST 一分钟的时间为 1970 年 1 月 1 日 00:01:00 CST,即使用 Date 对象表示为 Thu Jan 01
08:01:00 CST 1970。

方法

描述

booleanafter(Date when)

判断此日期是否在指定日期之后

boolean before(Datewhen)

判断此日期是否在指定日期之前

int compareTo(DateanotherDate)

比较两个日期的顺序

boolean equals(Object obj)

比较两个日期的相等性

long getTime()

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数

String toString()

把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzzyyyy。 其中 dow 是一周中的某一天(Sun 、Mon、Tue、Wed、Thu、Fri及Sat)

java.util.Calendar

Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历
字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。
创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个
getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字
段已由当前日期和时间初始化。

Calendar c = Calendar.getInstance();

当创建了一个 Calendar 对象后,就可以通过 Calendar 对象中的一些方法来处理日期、时间。

Calendar 类的常用方法如表所示。

Java时间戳排序 java 时间戳类型_jvm


Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。

Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静

态常量指定。

Calendar 类中定义了许多常量,分别表示不同的意义。

Calendar.YEAR:年份。

Calendar.MONTH:月份。

Calendar.DATE:日期。

Calendar.DAY_OF_MONTH:日期,和上面的字段意义完全相同。

Calendar.HOUR:12小时制的小时。

Calendar.HOUR_OF_DAY:24 小时制的小时。

Calendar.MINUTE:分钟。

Calendar.SECOND:秒。

Calendar.DAY_OF_WEEK:星期几。

例如,要获取当前月份可用如下代码:

int month = Calendar.getInstance().get(Calendar.MONTH);

如果整型变量 month 的值是 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12
月份。

public static void main(String[] args) {
        /*Calendar c=Calendar.getInstance();
        System.out.println(c);*/
       // System.out.printf("%tF %<tT%n",System.currentTimeMillis());
        int month = Calendar.getInstance().get(Calendar.MONTH);//当前时间
        System.out.println(month);//输出月
    }
运行结果:
2023-02-11 11:13:53
1
Calendar calendar=Calendar.getInstance();// 如果不设置时间,则默认为当前时间
        calendar.setTime(new Date());// 如果不设置时间,则默认为当前时间
        System.out.println("现在时刻:"+calendar.getTime());// 获取当前时间
        int year=calendar.get(Calendar.YEAR);// 获取当前年份
        System.out.println("现在是"+year+"年");
        int month=calendar.get(Calendar.MONTH)+1;// 获取当前月份(月份从 0 开始,所以加 1)
        System.out.println(month+"月");
        int day=calendar.get(Calendar.DATE);// 获取日
        System.out.println(day+"日");
        int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日第一天)
        System.out.println("星期" + week);
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
        System.out.println(hour + "时");
        int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
        System.out.println(minute + "分");
        int second = calendar.get(Calendar.SECOND); // 获取当前秒数
        System.out.println(second + "秒");
        int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
        System.out.println(millisecond + "毫秒");
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
        System.out.println("今天是本月的第 " + dayOfMonth + " 天");
        int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);// 获取今天是本月第几周
        System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
        int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
        System.out.println("今天是今年第 " + many + " 天");
        Calendar c1 = Calendar.getInstance();
        c1.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
        System.out.println("设置日期为 2012-8-8 后的时间:" + c1.getTime()); // 输出时间上面的示例代码演示了 Calendar 类中的方法与常量的结合使用,从而完成处理日期的操作。


        var c = Calendar.getInstance();
       // c.set();
       // c.get();
        System.out.println(c.get(Calendar.HOUR_OF_DAY));//获取小时
       //System.out.println(new Date().getHours());
        // c.add();
       //设置-7天,获取7天前的日期
        c.add(Calendar.DATE, -7);
       //日历类转换为Date类
        Date d = c.getTime();
       //日历类获取时间戳
        long ts = c.getTimeInMillis();
        System.out.printf("%tF %<tT%n", c);
 运行结果:
现在时刻:Sat Feb 11 11:40:49 CST 2023
现在是2023年
2月
11日
星期6
11时
40分
49秒
220毫秒
今天是本月的第 11 天
今天是本月第 2 周
今天是今年第 42 天
设置日期为 2012-8-8 后的时间:Sat Sep 08 11:46:02 CST 2012
11
2023-02-04 11:46:02

java8 DateAPI

LocalDate

dk1.8 新的日期API java.time.LocalDate类 java.util.Date Calendar
此类只有年月日
public static void main(String[] args) {
        //实例化
        LocalDate d1=LocalDate.now();
        var d2=LocalDate.of(1985,10,17);
        //常用操作
        System.out.println(d1);
        //今日5天后日期
        System.out.println(d1.plusDays(5));
        //今日2天前日期
        System.out.println(d1.minusDays(3));
        //今日25个月后的日期
        System.out.println(d1.plus(25, ChronoUnit.MONTHS));

        //今日日期的月份  二月
        var msn=d1.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINESE);
        System.out.println(msn);

        //今日 星期六
        var wsn = d1.getDayOfWeek().getDisplayName(TextStyle.FULL,Locale.CHINESE);
        System.out.println(wsn);
        //今日 周六
        var sn = d1.getDayOfWeek().getDisplayName(TextStyle.SHORT,Locale.CHINESE);
        System.out.println(sn);
        //计算两个日期之间的天数
        long days = ChronoUnit.DAYS.between(d2,d1);
        System.out.printf("%s 到 %s 之间有 %d 天",d2,d1,days);
        System.out.println();
        //格化输出
        System.out.println(d1);
        System.out.println(d2);
        System.out.printf("%tF%n",d1);
        System.out.printf("%tF%n",d2);
        System.out.printf("%tY年%<tm月%<td日 %<tA%n",d1);
        System.out.printf("%tY年%<tm月%<td日 %<tA%n",d2);
        System.out.println(d1.isLeapYear());
        //专业的格式工具类java.time.DateTimeFormatter
        //var fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E ML");
        var fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E M L",Locale.CHINA);
        System.out.println(fmt.format(d1));
        System.out.println(fmt.format(d2));
    }
运行结果:
2023-02-11
2023-02-16
2023-02-08
2025-03-11
二月
星期六
周六
1985-10-17 到 2023-02-11 之间有 13631 天
2023-02-11
1985-10-17
2023-02-11
1985-10-17
2023年02月11日 星期六
1985年10月17日 星期四
false
2023年02月11日 周六 2 2
1985年10月17日 周四 10 10

LocalTime

java.time.LocalTime
public static void main(String[] args) {
        //LocalTime 实例化
        var t1= LocalTime.now();
        var t2=LocalTime.of(14,30,20);
        var t3=LocalTime.parse("15:25:35", DateTimeFormatter.ofPattern("HH:mm:ss"));

        //简单输出
        System.out.println(t1);
        System.out.printf("%tT%n",t1);
        System.out.println(t2);
        System.out.println(t3);

        //格式化输出
        DateTimeFormatter df=DateTimeFormatter.ofPattern("HH时mm分ss秒");
        System.out.println(df.format(t1));
        System.out.println(df.format(t2));
        System.out.println(df.format(t3));
        System.out.println(t1.plusSeconds(1000));
        var sns=t1.plusSeconds(1000).format(DateTimeFormatter.ofPattern("HH:mm:ss"));
        System.out.println(sns);
    }
运行结果:
14:48:39.341209100
14:48:39
14:30:20
15:25:35
14时48分39秒
14时30分20秒
15时25分35秒
15:05:19.341209100
15:05:19

LocalDateTIme

java.time.LocalDateTime

此类包含了年月日时分秒 相关信息,相当于LocalDateTime = LocalDate + LocalTime 了
相当于以前的java.util.Date,也相当于java.util.Calendar类

public static void main(String[] args) {
        var d1 = LocalDateTime.now();
        System.out.println(d1);
        System.out.printf("%tF %<tT %n",d1);
        System.out.printf("%tF%n",d1);
        System.out.printf("%tT%n",d1);
        System.out.printf("%tY年%<tm月%<td日 %<tH:%<tM:%<tS %<tA %<tp %s %n",d1,d1.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINA));
        //将字符串转换为LocalDateTime
        var d2 = LocalDateTime.of(2022,10,17,14,49,50);
        System.out.println(d2);
        System.out.println(d2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        System.out.println("--------------------");
        String str = "2022-03-15 20:30:40";
        var d3 = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(d3);
    }
运行结果:
2023-02-11T15:37:05.435471500
2023-02-11 15:37:05 
2023-02-11
15:37:05
2023年02月11日 15:37:05 星期六 下午 二月 
2022-10-17T14:49:50
2022-10-17 14:49:50
--------------------
2022-03-15T20:30:40