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