JAVA中的六種日期類型使用


基本的6種日期類

/**
         * 六種時間類型的類
         * 數據庫格式的時間三種格式
         */
        java.util.Date date = new java.util.Date();//年與日時分秒
        //數據庫的三種類都繼承了java.util.Date,在除了數據庫的情況下使用
        java.sql.Date sDate = new java.sql.Date(date.getTime());//年月日  
        java.sql.Time  sTime = new java.sql.Time(sDate.getTime());//時分秒
        java.sql.Timestamp sTimeStamp = new java.sql.Timestamp(sTime.getTime());//年月日時分秒毫秒

        //時間格式轉換
        java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        //日歷類是一個抽象基類
        java.util.Calendar calender = Calendar.getInstance();//

        System.out.println(date);
        System.out.println(sDate);
        System.out.println(sTime);
        System.out.println(sTimeStamp);
        System.out.println(calender);

輸出的日期格式:

Thu Mar 28 14:47:18 CST 2019
2019-03-28
14:47:18
2019-03-28 14:47:18.162
java.util.GregorianCalendar[time=1553755638277,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=2019,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=5,DAY_OF_MONTH=28,DAY_OF_YEAR=87,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=47,SECOND=18,MILLISECOND=277,ZONE_OFFSET=28800000,DST_OFFSET=0]

由此可以看出幾種類的時間格式有差異

類名稱 時間格式
java.util.Date 年月日時分秒
java.sql.Date 年月日
java.sql.Time 時分秒
java.sql.Timestamp 年月日時分秒毫秒
java.util.Calendar 年月日時分秒毫秒
查詢源碼可知除過Calendar 類外其他的類都是繼承java.util.Date類並且屏蔽了相關時間精度,重寫了toString()方法。
但是都屬於同一父類的繼承可以進行相互轉換,getTime()方法獲取當前時間的秒數還是沒有進行重寫,獲得時間秒數都是一樣 (Timestamp除外,Timestamp重寫了getTime添加了毫秒數)
對於基礎以上的java.util.Date的繼承類來說,都會存在一個問題,那就是對於許多方法都已經廢棄掉,java提供了Calendar 和 SimpleDateFormat 來支持時間日期的更方便操作。

Calendar
Java.util.Calendar區別與java.util.Date的幾個地方也需要注意一下 :

首先,Calendar增加了毫秒的時間段,通過它可以獲取時間點的毫秒值,而java.util.Date只是精確到秒。
其次,Calendar過去年的時候是當前年份比如:2010,而Date獲取年份的時獲取到的是當前年份-1900的一個值(2010-1900=110,因此,你調用getYear后過去的值就是110)。
Calendar是一個抽象類,之所以能夠實例化,是因為此處的Calendar充當了一個類似於工廠的作用,在getInstance方法中實例化了Calendar子類GregorianCalendar,並把它返回給用戶使用。
兩個類是可以進行相互轉換的可以使用Calendar類的setTime(Date date)方法可以轉換,獲取Date隊形可以getTime()方法可以轉換成Date對象

/** Calendar.class**/
/**
     * Returns a <code>Date</code> object representing this
     * <code>Calendar</code>'s time value (millisecond offset from the <a
     * href="#Epoch">Epoch</a>").
     *
     * @return a <code>Date</code> representing the time value.
     * @see #setTime(Date)
     * @see #getTimeInMillis()
     */
    public final Date getTime() {
        return new Date(getTimeInMillis());
    }

    /**
     * Sets this Calendar's time with the given <code>Date</code>.
     * <p>
     * Note: Calling <code>setTime()</code> with
     * <code>Date(Long.MAX_VALUE)</code> or <code>Date(Long.MIN_VALUE)</code>
     * may yield incorrect field values from <code>get()</code>.
     *
     * @param date the given Date.
     * @see #getTime()
     * @see #setTimeInMillis(long)
     */
    public final void setTime(Date date) {
        setTimeInMillis(date.getTime());
    }

Calendar和Date可以及逆行轉換,也就打通了過時時間類的使用具體的方法還需要多加練習

SimpleDateFormat 日期格式轉換

主要使用的是SimpleDateFormat 類的日期格式轉換和日期字符串解析成日期對象
*接上述代碼

//時間格式轉換
        java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println("格式轉換后:");
        //類型轉換參數是Date類型,返回值只是 一個字符串
        System.out.println(dateFormat.format(date));
        System.out.println(dateFormat.format(sDate));
        System.out.println(dateFormat.format(sTime));
        System.out.println(dateFormat.format(sTimeStamp));
        System.out.println(dateFormat.format(calender.getTime()));

格式轉換后:
2019-03-28 02:47:18
2019-03-28 02:47:18
2019-03-28 02:47:18
2019-03-28 02:47:18
2019-03-28 02:47:18

//時間格式的解析    
        //日期字符轉換成日期對象
        //首先進行字符串模式的規定
        java.text.SimpleDateFormat dateFormat1 = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //進行字符串的解析,都會解析成Date基類(會產生解析異常)
        java.util.Date date1 = dateFormat1.parse("2020-12-12 12:20:01");
        System.out.println(date1);    

Sat Dec 12 00:20:01 CST 2020

時間格式的解析,如果時間格式不符合會出現ParseException異常

/**
     * Parses text from the beginning of the given string to produce a date.
     * The method may not use the entire text of the given string.
     * <p>
     * See the {@link #parse(String, ParsePosition)} method for more information
     * on date parsing.
     *
     * @param source A <code>String</code> whose beginning should be parsed.
     * @return A <code>Date</code> parsed from the string.
     * @exception ParseException if the beginning of the specified string
     *            cannot be parsed.
     */
    public Date parse(String source) throws ParseException
    {
        ParsePosition pos = new ParsePosition(0);
        Date result = parse(source, pos);
        if (pos.index == 0)
            throw new ParseException("Unparseable date: \"" + source + "\"" ,
                pos.errorIndex);
        return result;
    }

這些時間格式我們應該如何使用
對於現在的日期格式,只要我們幾乎都是可以像話轉換和借助格式化類行進操作的,具體的到底使用什么類型還是需要看業務需要

==針對不同的數據庫選用不同的日期類型 ==
  Oracle的Date類型,只需要年月日,選擇使用java.sql.Date類型
  MS Sqlserver數據庫的DateTime類型,需要年月日時分秒,選擇java.sql.Timestamp類型

oracle數據庫提供的todate()和tochar()函數也可以進行日期格式的轉換,所以我們使用的時候最好對日期格式進行格式進行統一轉換
可以參考博客(對於不同數據庫的日期格式的使用)

 

Java多線程編程中使用DateFormat類

全網最權威Java8日期時間類詳解

java 日期相關類的學習和多線程下的日期格式化使用

Java常用類:關於日期、時間的常用類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM