前言:
在日常Java開發中,常常會使用到Date的相關操作,如:獲取當前系統時間、獲取當前時間戳、時間戳按指定格式轉換成時間等。以前用到的時候,大部分是去網上找,但事后又很快忘記。現為方便自己今后查閱,也方便各位猿友學習探討,在此將我們常用的時間實例、函數歸納羅列出來,供大家參考,如有不對,歡迎在評論區共同探討。
1、獲取系統當前時間
獲取系統當前時間,我們經常會用到,如:判斷優惠券是否已經過期、更新某條數據的時間等。(當然,這些也可以在sql中進行)
方法一:
Date類對象是用來表示時間和日期的,這個類提供了一系列操作時間和日期的函數,獲取系統當前時間就是我們最常用的。如下:
1 public static void main(String[] args) { 2 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 3 SimpleDateFormat dateForm24 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 4 Date date1 = new Date(); 5 System.out.println("系統當前時間是(未格式化):" + date1); 6 System.out.println("系統當前時間是(已格式化):" + dateFormat.format(date1)); 7 System.out.println("系統當前時間是(格式-24):" + dateForm24.format(date1)); 8 } 9 控制台輸出: 10 系統當前時間是(未格式化):Fri Dec 27 16:43:47 CST 2019 11 系統當前時間是(已格式化):2019-12-27 04:43:47 12 系統當前時間是(格式-24):2019-12-27 16:43:47
從控制台輸出,我們可以看到,同一個時間有三種表達樣式。這里解釋一下,第一種是格林威治時間格式,這通常不是我們想要的結果,所以引入了后兩種。
后兩種我們使用了時間日期格式化類(SimpleDateFormat)來把時間格式化成我們想要的樣式。這里需要注意的是,后兩種在“小時”的樣式上略有不同,小寫的“hh”表示12小時制,大寫的“HH”則為24小時制,我們使用時可根據需求而定。
方法二:
除了Date類,我們還經常使用Calendar類來操作時間和日期,我們可以把它看做是Date類的增強版,因為Calendar類提供了一組方法,允許將一個以毫秒為單位的時間轉換成年、月、日、時、分、秒、星期等。我們可以把Calendar類看做是萬年歷,默認顯示的是當時間,同時也可以查看其他時間。如下:(其實,Calendar底層也是通過new Date() 獲取Date實例)
1 public static void main(String[] args) { 2 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 3 Calendar calendar = Calendar.getInstance(); 4 Date date2 = calendar.getTime(); 5 System.out.println("系統當前時間是:" + dateFormat.format(date2)); 6 //還可以使用[年月日 時分秒]拼接的方式獲取; 7 int year = calendar.get(Calendar.YEAR); //年 8 int month = calendar.get(Calendar.MONTH)+1; //月(從0開始,故要+1):11 9 //星期幾:先判斷一周的第一天是不是星期天;如果是,則-1; 10 int dayOfWeek = calendar.getFirstDayOfWeek()==Calendar.SUNDAY?calendar.get(Calendar.DAY_OF_WEEK)-1:calendar.get(Calendar.DAY_OF_WEEK); 11 int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); //日(年的第N日) 12 int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); //日(月的第N日) 13 int day = calendar.get(Calendar.DATE); //日(同上) 14 int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); //時(24小時制) 15 int hour = calendar.get(Calendar.HOUR); //時(12小時制) 16 int minute = calendar.get(Calendar.MINUTE); //分 17 int second = calendar.get(Calendar.SECOND); //秒 18 int millisecond = calendar.get(Calendar.MILLISECOND); 19 System.out.println("現在是:"+year+"年"+month+"月"+day+"日" 20 +hourOfDay+"點("+hour+"點)"+minute+"分"+second+"秒"+millisecond 21 +"毫秒,星期"+dayOfWeek+",這是"+year+"年的第"+dayOfYear+"天."); 22 } 23 24 控制台輸出: 25 系統當前時間是:2019-12-27 17:16:17 26 現在是:2019年12月27日17點(5點)16分17秒94毫秒,星期5,這是2019年的第361天.
這里有兩個地方需要注意:
1、獲取月份:int month = calendar.get(Calendar.MONTH)+1; 直接獲取到的月份默認是從0開始的,即當前12月獲取到的是11,所以這里要 +1;
2、獲取星期:上面我用了個三元,拆開來就是要比較【一周的第一天是不是周日】。
1 //int dayOfWeek = calendar.getFirstDayOfWeek()==Calendar.SUNDAY?calendar.get(Calendar.DAY_OF_WEEK)-1:calendar.get(Calendar.DAY_OF_WEEK); 2 //當前星期幾 3 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 4 //一周的第一天 5 int firstDayOfWeek = calendar.getFirstDayOfWeek(); 6 //星期日 7 int sunday = Calendar.SUNDAY; 8 //如果一周的第一天是星期日,則需要-1; 9 if (firstDayOfWeek==sunday){ 10 dayOfWeek --; 11 } 12 System.err.println("今天是星期" + dayOfWeek);
方法三:
除了直接獲取時間,我們還可以通過獲取當前時間的毫秒值,然后再轉換成時間。
1 public static void main(String[] args) { 2 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 3 long nowLong=System.currentTimeMillis(); //獲取出來的是當前時間的毫秒值 4 //把毫秒值轉換成時間格式 5 Date date = new Date(); 6 date.setTime(nowLong); 7 System.out.println("系統當前時間是:" + dateFormat.format(date)); 8 } 9 //控制台輸出: 10 // 系統當前時間是:2019-12-27 18:00:00 --->這是什么意思???????
Tip:以上就是獲取系統當前時間的三種方式,各位大佬有其他更好的方式,歡迎評論區補充。
2、獲取當前時間的前一天/后一天
Tip:通過觀察可以發現,前一天和后一天只是修改了 -1 和 +1 這兩個值。
private static void getYesterday() { //獲取前一天的時間 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, -1); date = calendar.getTime(); System.out.println("當前時間是:" + (format.format(new Date())) + ",昨天是:" + (format.format(date))); //>>>> 當前時間是:2020-06-23 14:53:15,昨天是:2020-06-22 14:53:15 } private static void geTomorrow() { //獲取前一天的時間 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, +1); date = calendar.getTime(); System.out.println("當前時間是:" + (format.format(new Date())) + ",明天是:" + (format.format(date))); //>>>> 當前時間是:2020-06-23 14:53:15,明天是:2020-06-24 14:53:15 }
3、獲取某個時間的整點時間
要獲取某個時間的整點時間,主要在使用格式的時候,把格式設置為 HH:00:00 ;
private static void getHour() throws ParseException { //獲取某個時間的整點時間; Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sdf.format(date); //獲取整點時間,主要是使用這個 HH:00:00 的時間格式; SimpleDateFormat hourFormatter = new SimpleDateFormat( "yyyy-MM-dd HH:00:00"); String hourStr = hourFormatter.format(date); System.out.println("當前時間是:" + dateStr + ",整點時間是:" + hourStr); //>>>> 當前時間是:2020-06-23 14:50:22,整點時間是:2020-06-23 14:00:00 }
4、獲取某個時間的前(后)一個小時
private static void getOneHourAgo() throws ParseException { //獲取前(往后)一小時的時間 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //這里設置你想要的時間 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); //提前的時間用-1,往后的時間用+1; calendar.add(Calendar.HOUR_OF_DAY, +1); date = calendar.getTime(); System.out.println("當前時間是:" + sdf.format(new Date()) + ",前一小時是:" + sdf.format(date)); //>>>> 當前時間是:2020-06-23 15:02:55,前一小時是:2020-06-23 16:02:55 }
5、比較兩個時間前后
private static void compareTime() throws ParseException { //兩個時間進行比較,往往是我們比較頭疼的,用下面的方法,簡單明了,簡直是止痛神葯! String DateStr1 = "2018-03-01 00:01:01"; String DateStr2 = "2024-12-10 15:50:35"; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateTime1 = dateFormat.parse(DateStr1); Date dateTime2 = dateFormat.parse(DateStr2); Calendar calendar = Calendar.getInstance(); Date systemDate = calendar.getTime(); int ago = dateTime1.compareTo(systemDate); int future = dateTime2.compareTo(systemDate); System.out.println("以前的時間:" + ago + ",未來的時間:" + future); //>>>> 以前的時間:-1,未來的時間:1 ; }
Tip:
兩個Date類型的變量可以通過 date1.compareTo(date2);方法來比較。此方法的描述是這樣的:
如果參數 date1 等於此 date2,則返回值 0;
如果此 date1 在 date2 參數之前,則返回小於 0 的值;
如果此 date2 在 date2 參數之后,則返回大於 0 的值。
實際上比較的是自1970 年 1 月 1 日 00:00:00 GMT以來的毫秒數。毫秒數越大的時間越大。
6、計算兩個時間差
我們在數據庫
public static void getTimeDifference() throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date1 = dateFormat.parse("2020-05-01 18:53:40"); Date date2 = new Date(); //一天的毫秒數 long d = 1000 * 24 * 60 * 60; //一小時的毫秒數 long h = 1000 * 60 * 60; //一分鍾的毫秒數 long m = 1000 * 60; // long ns = 1000; // 獲得兩個時間的毫秒時間差異 long timeDiff = Math.abs(date2.getTime() - date1.getTime()); // 計算差多少天 long day = timeDiff / d; // 計算差多少小時 long hour = timeDiff % d / h; long hour01 = timeDiff / h; // 計算差多少分鍾 long min = timeDiff % d % h / m; //輸出結果 System.out.println("當前時間是:" + dateFormat.format(date2)); System.out.println("比較時間是:" + dateFormat.format(date1)); System.out.println("間隔:" + day + "天" + hour + "小時" + min + "分鍾"); /* 當前時間是:2020-06-23 15:59:33 比較時間是:2020-05-01 18:53:40 間隔:52天21小時5分鍾 */ }
Tip:這里使用了Math.abs()函數取絕對值,如果不用這個函數,那就需要注意一下哪個時間 減 哪個時間;