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類簡介
