Java日期類:Date和Calendar的使用

老是使用這兩個類,老是須要百度。還不如一次所有整理完。html

1、介紹:

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 用於日期相關的計算;java

2、使用:

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的區別。web

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類好像沒有相關轉換的方法app

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:表示無加減;dom

Calendar.YEAR:年ssh

Calendar.MONTH:月ide

Calendar.DATE:日svg

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) {

    }
}

 

3、結束:
相關文章
相關標籤/搜索