總是使用這兩個類,總是需要百度。還不如一次全部整理完。
一、介紹:
Date 類
- Date 表示特定的瞬間,精確到毫秒。
- 在 JDK 1.1 之前,類 Date 有兩個其他的函數。它允許把日期解釋為年、月、日、小時、分鍾和秒值。它也允許格式化和解析日期字符串。不過,這些函數的 API 不易於實現國際化。從 JDK 1.1 開始,應使用 Calendar 類實現日期和時間字段之間轉換,使用 DateFormat 類來格式化和解析日期字符串。Date 中的相應方法已廢棄(查閱自 API 文檔)
Calendar 類
- Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日歷字段之間的轉換提供了一些方法,並為操作日歷字段(例如獲得下星期的日期)提供了一些方法。
- 瞬間可用毫秒值來表示,它是距歷元(即格林威治標准時間 1970 年 1 月 1 日的 00:00:00.000,格里高利歷)的偏移量。
簡單說就是:java.util.Date
是個日期數據;java.util.Calendar
用於日期相關的計算;
二、使用:
2.1 如何實例化當前時間?
Date date = new Date(); Calendar calendar = Calendar.getInstance(); System.out.println(date.toString()); //輸出:Thu Oct 18 13:46:43 CST 2018 System.out.println(calendar.toString()); //輸出:java.util.GregorianCalendar[time=1539841603042,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=291,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=1,HOUR_OF_DAY=13,MINUTE=46,SECOND=43,MILLISECOND=42,ZONE_OFFSET=28800000,DST_OFFSET=0]
根據輸出,我們也可以看出Date和Calendar的區別。
2.2 如何實例化特定時間?
1 //注:mm:ss必須小寫,否則無法轉換。HH大小寫無影響。 2 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 3 Date date1 = null; 4 try { 5 date1 = df.parse("2017-08-07 11:11:11"); 6 } catch (ParseException e) { 7 e.printStackTrace(); 8 } 9 10 Calendar calendar1 = Calendar.getInstance(); 11 calendar1.setTime(date1);
實例化時注意:
- 建議從Date使用格式轉換,然后賦值(setTime)給Calendar,不然直接設置Calendar用毫秒數(setTimeInMillis)太麻煩。(其實不知道怎么設置....)
- 另外,實例化時的格式:
yyyy-MM-dd hh:mm:ss
。mm:ss必須小寫,否則無法轉換。HH大小寫無影響。
2.3 Date和Calendar如何互相轉化?
Date date1 = new Date(); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); Date date = calendar1.getTime();
Calendar類有兩個方法:setTime和getTime。
- setTime接收一個Date類型的參數;
- getTime返回一個Date類型的結果;
主要是通過這個方式實現互相轉換。Date類好像沒有相關轉換的方法
2.4 如何格式化時間?
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String s = df.format(new Date());
使用DateFormat類,進行format。
2.5 如何對日期進行操作。即日期加減:年月日以及小時分秒等。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date1 = new Date(); //輸出:2018-10-18 02:18:27 System.out.println(df.format(date1)); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); calendar1.add(Calendar.MONTH,1); Date date = calendar1.getTime(); //輸出:2018-11-18 02:18:27 System.out.println(df.format(date));
使用Calendar的add方法
:下面是官方接口定義:
abstract void |
add(int field, int amount) 根據日歷的規則,為給定的日歷字段添加或減去指定的時間量。 |
---|---|
- field表示時間量:可以為如下:
Calendar.ERA
:表示無加減;
Calendar.YEAR
:年
Calendar.MONTH
:月
Calendar.DATE
:日
Calendar.HOUR
:小時
Calendar.MINUTE
:分鍾
Calendar.SECOND
:秒
注意:Calendar
中的所有常量都可以為參數,不一定局限於上面的。比如Calendar.HOUR_OF_DAY
,Calendar.WEEK_OF_MONTH
等。不管是什么,只要這個值和周相關就是周(月中的第幾周,年中的第幾周等),和日相關就是日(一年當中的第幾天,一月當中的第幾天,一周當中的第幾天),和小時相關就是小時
- amount:為整數表示當前時間的基礎上加上對應的時間量;為負數表示當前時間的基礎上減去對應的時間量。
2.6 其他常用方法
2.6.1 獲取當天結束時間:59分59秒0毫秒
private Date getDayEnd() { Calendar cal = new GregorianCalendar(); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); }
2.6.2 日期工具類(DateUtils.java)
package com.dmall.virtual.domain.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateUtils { public static final String MMddHHmmss = "MM-dd HH:mm:ss"; public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss"; public static final String yyyy_MM_dd = "yyyy-MM-dd"; public static final String yyyyMMdd = "yyyy.MM.dd"; public static final String HHmm = "HH:mm"; public static final String MM_dd = "MM-dd"; public static final String yyyy_MM_dd_other = "yyyy-MM-dd"; private static final Logger logger = LoggerFactory.getLogger(DateUtils.class); /** * 根據基礎時間(base),單位(unit),偏移量(differ)對時間進行偏移並返回偏移后的時間 * @param base * @param forward * @param unit * @param differ * @return */ public static Date shiftDate(Date base, boolean forward, DateUnit unit, int differ){ if(base == null){ return null; } if(differ <= 0){ return base; } Calendar c = Calendar.getInstance(); c.setTime(base); c.set(unit.getUnit(), c.get(unit.getUnit()) +(forward ? differ : -differ)); return c.getTime(); } public enum DateUnit{ YEAR(Calendar.YEAR), MONTH(Calendar.MONTH), WEEK(Calendar.MONTH), DAY(Calendar.DAY_OF_YEAR), HOUR(Calendar.HOUR_OF_DAY), MINUE(Calendar.MINUTE), SECOND(Calendar.SECOND); private int unit; private DateUnit(int unit){ this.unit = unit; } public int getUnit() { return unit; } public void setUnit(int unit) { this.unit = unit; } } /** * 日期格式化為字符串 * @param date * @param format * @return */ public static String formatDate(Date date, String format) { if (date == null) { return null; } try{ SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); }catch(Exception e){ logger.error("日期格式化失敗,date={}", date,e); return null; } } /** * 字符串格式化為日期 * @param dateStr * @param format * @return */ public static Date parseDate(String dateStr, String format){ DateFormat formatter = new SimpleDateFormat(format); if(StringUtils.isBlank(dateStr)){ return null; } try { return formatter.parse(dateStr.trim()); } catch (ParseException e) { logger.warn("ParseException日期異常1,參數dateStr={},format={}",new Object[]{dateStr,format,e}); return null; }catch (Exception e) { logger.warn("ParseException日期異常2,參數dateStr={},format={}",new Object[]{dateStr,format,e}); return null; } } /** * 獲取當天指定時間(時-分-秒)的日期 * @param hours * @return */ public static Date getSpecialHms(Date date, int hours, int minutes, int seconds) { if(date == null){ return null; } Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, hours); cal.set(Calendar.MINUTE, minutes); cal.set(Calendar.SECOND, seconds); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } /** * 獲取指定日期的小時 * @return */ public static int getCurrentHours(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.HOUR_OF_DAY); } public static void main(String[] args) { } }
三、結束: