Java 中计算时间和日期的方式


Java 中计算时间和日期的方式

简要:
  Java中计算日期时间的有 Date类 加 SimpleDateFormat类和 System类中的 currentTimeMillis 方法,还有专门用于日期的 Calendar类。这里就介绍如何使用这三种方式获取当前时间,以及一些注意点。

注意:当前计算机时间是跟你的计算机所在时区是有关的!!!所以会有时差
GMT时间(格林威治时间)1970年1月1号0时0分0秒
中国东八区相差8小时(北京时间)1970年1月1号8时0分0秒

一、Date 类 加 SimpleDateFormat 类

        // 注意使用的是 java.util 包下的
        Date date = new Date();

        /*
        常用的:
            yyyy    年 (年份四位数)
            MM      月 (两位数 12个月)
            dd      日  两位数 不确定)
            HH      时  24制 / hh    12制
            mm      分 (两位数 60进制)
            ss      秒 (两位数 60进制)
            SSS     毫秒 (1000 毫秒 == 1 秒)
         */

        // java.text 包下的,用于日期格式化
        // 其它符号如(- : .)就是连接符,原样输出,也可以是中文
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");

        System.out.println(date);// Thu Nov 26 10:43:47 CST 2020
        System.out.println(sdf1.format(date));// 2020-11-26 10:43:47.999
        System.out.println(sdf2.format(date));// 2020年11月26日 10时51分02秒

        // String 转 Date 使用 SimpleDateFormat 的 parse 方法
        // 格式需要相同,否则会解析异常抛出 ParseException
        try {
            String time = "2008-08-08 08:08:08.888";
            Date parse = sdf1.parse(time);
            System.out.println(parse);// Fri Aug 08 08:08:08 CST 2008
        } catch (ParseException e) {
            e.printStackTrace();
        }


        // 参数是 毫秒 ,从1970年1月1日00:00:00开始的总毫秒数。
        /*
            这里就会发现一个问题 这是从1970-01-01 08:00:00.000开始的.
            为什么呢?
                其中两者相差 28800 = 8 * 60 * 60 ,即相差八个小时,
                而 1970-1-1 00:00:00.00 是世界时间(英国格林威治)。
                中国属于东八区,会把时间增加8个小时,
                这就知道 1970-01-01 08:00:00.000 是中国时间(北京时间),
                在连接数据库时你也会发现差八个小时。
         */
        Date date1 = new Date(1000);
        System.out.println(sdf1.format(date1));// 1970-01-01 08:00:01.000

二、System 类中的 currentTimeMillis 方法

用这个求年月日太麻烦了,一般用于方法的执行时间计算,因为是毫秒级的

        // 获取自 1970年1月1日 00:00:00 000 到当前系统时间的总毫秒数。
        // 更正:本人所处中国,所以是 1970年1月1日 08:00:00 000
        long totalMilliSeconds = System.currentTimeMillis();
        System.out.println(totalMilliSeconds);// 1606380866748

        //单位从毫秒转换为秒
        long totalSeconds = totalMilliSeconds / 1000;

        //求出现在的秒
        long currentSecond = totalSeconds % 60;

        //求出现在的分
        long totalMinutes = totalSeconds / 60;
        long currentMinute = totalMinutes % 60;

        //求出现在的小时
        long totalHour = totalMinutes / 60;
        long currentHour = totalHour % 24;

        //显示时间
        System.out.println("总毫秒为: " + totalMilliSeconds);
        System.out.println(currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
        //8:54:26 GMT 格林威治时间

        // 因为年日不是太规律的,还是不好换算,所以 Date 方便
        Date nowTime = new Date(totalMilliSeconds);
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String retStrFormatNowDate = sdf3.format(nowTime);
        System.out.println(retStrFormatNowDate);// 2020-11-26 16:54:26.748

三、Calendar 类(日历类)

以下代码摘自:http://www.51gjie.com/java/611.html

        // 完整显示日期时间
        String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
        System.out.println(str);

        // 创建 Calendar 对象
        Calendar calendar = Calendar.getInstance();
        // 初始化 Calendar 对象,但并不必要,除非需要重置时间
        calendar.setTime(new Date());

        // setTime 类似上面一行
        // Date date = new Date();
        // calendar.setTime(date);

        // 显示年份
        int year = calendar.get(Calendar.YEAR);
        System.out.println("YEAR is = " + String.valueOf(year));

        // 显示月份 (从0开始, 实际显示要加一)
        int MONTH = calendar.get(Calendar.MONTH);
        System.out.println("MONTH is = " + (MONTH + 1));

        // 今年的第 N 天
        int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);

        // 本月第 N 天
        int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));

        // 3小时以后
        calendar.add(Calendar.HOUR_OF_DAY, 3);
        int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
        System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);

        // 当前分钟数
        int MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE = " + MINUTE);

        // 15 分钟以后
        calendar.add(Calendar.MINUTE, 15);
        MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE + 15 = " + MINUTE);

        // 30分钟前
        calendar.add(Calendar.MINUTE, -30);
        MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE - 30 = " + MINUTE);

        // 格式化显示
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
        System.out.println(str);

        // 重置 Calendar 显示当前时间
        calendar.setTime(new Date());
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
        System.out.println(str);

        // 创建一个 Calendar 用于比较时间
        Calendar calendarNew = Calendar.getInstance();

        // 设定为 5 小时以前,后者大,显示 -1
        calendarNew.add(Calendar.HOUR, -5);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));

        // 设定7小时以后,前者大,显示 1
        calendarNew.add(Calendar.HOUR, +7);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));

        // 退回 2 小时,时间相同,显示 0
        calendarNew.add(Calendar.HOUR, -2);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));

运行结果

2020-11-26 17:15:53:593
YEAR is = 2020
MONTH is = 11
DAY_OF_YEAR is = 331
DAY_OF_MONTH = 26
HOUR_OF_DAY + 3 = 20
MINUTE = 15
MINUTE + 15 = 30
MINUTE - 30 = 0
2020-11-26 20:00:53:594
2020-11-26 17:15:53:594
时间比较:-1
时间比较:1
时间比较:0

四、参考

http://www.51gjie.com/java/611.html
System.currentTimeMillis()计算方式与时间的单位转换
Java的常用API之Date类简介


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM