細談Java中的時間與日期

Data類

         java.util.Date類實在Java之中得到日期時間操做的最簡單的一個程序類,這個類能夠直接經過實例化Date類對象的形式獲取當前的日期時間。html

範例:獲取當前的日期時間java

import java.util.Date;api

public class Demo {多線程

         public static void main(String args[]) {oracle

                   System.out.println(new Date());工具

         }學習

}this

程序執行結果:spa

Fri Mar 27 19:12:56 CST 2020線程

         Date 裏面給出的日期時間默認格式採用的是外國人的習慣,雖然中國人民不習慣,可是裏面包含有正確的信息,若是想要進行更加詳細的處理,後面會有專門的類,除了以上的構造方法以外,在整個的Date類裏面也提供有以下的操做方法。

 

No.

方法名稱

類型

描述

01

Public Date()

普通

獲取當前的日期時間對象

02

Public Date(long date)

普通

將時間戳數字轉爲Date類對對象

03

Public long getTime()

普通

將日期時間以long數據類型的形式返回

04

public boolean after​(Date when)

普通

是否在指定日期時間以後

05

public boolean before​(Date when)

普通

是否在指定的日期時間以前

         在Java程序裏面,日期時間、內存大小或者文件大小都是用long數據類型來進行描述(毫秒數),在date類裏面經過構造方法能夠接受一個long日期時間的數字,也能夠經過Date返回一個long的數據類型。若是想要清楚的理解Date類之中兩個構造彼此之間的關係,最佳的作法仍是須要瀏覽一下Date類的構造方法源代碼。

【構造方法】Public Date()

【構造方法】Public Date(long date)

    public Date() {

        this(System.currentTimeMillis());

    }

    public Date(long date) {

        fastTime = date;

}

private transient long fastTime;

         所謂的無參構造方法實際上會自動進行單參構造的調用,而且傳遞的參數也是System類之中所得到的當前的日期時間的數值。

下面來研究一下long與Date類之間的轉換。

範例:觀察long與Date類之間的轉換操做:

import java.util.Date;

publicclass Demo {

    publicstaticvoid main(String args[]) {

        longdateTime = System.currentTimeMillis() - 10000; //獲得一個long數據類型

        Date DateA = new Date(dateTime);    //  long轉化爲Date類型

        Date DateB = new Date();

        System.out.println(DateA);     

        System.out.println(DateB);

        System.out.println("兩個日期間的毫秒數:" + (DateB.getTime() - DateA.getTime()));

        System.out.println("【前後關係】AFTER" + (DateA.after(DateB)));

        System.out.println("【前後關係】BEFORE" + (DateA.before(DateB)));

    }

}

程序執行結果:

Sun Mar 29 13:41:57 CST 2020

兩個日期間的毫秒數:10005       //10005是由於程序執行操做時間不定,應該爲10000

【前後關係】AFTER:false

【前後關係】BEFORE:true

         經過此時的程序代碼的執行能夠獲得以下兩個重要信息:日期時間和long之間的轉換、Date類能夠實現日期前後關係的判斷。

 

 

Calendar類

         在Javaz中雖然Date類能夠描述日期時間,可是除了日期時間以外的許多關於日曆有關從操做,例如:①須要知道某一個日期所在月的最後一天。②判斷某一個日期是否處於閏年。對於這些繁瑣的日期處理操做。這時候在Java中就能夠採用一個java.util.Calendar程序類來完成相應的處理操做,。

觀察Calendar類的基本定義:

public abstract class Calendar

extends Object

implements Serializable, Cloneable, Comparable<Calendar>

 

         發現Calendar 類屬於抽象類,那麼按照原始的概念來理解的話,這個時候應該經過子類進行該對象的實例化,而經過JavaDoc文檔能夠發現有一個「GregorianCalendar」子類 。

觀察Calendar類之中提供的方法。

No.

方法名稱

類型

描述

01

public static Calendar getInstance()

普通

獲取Calendar類的操做實例

02

public int get​(int field)

普通

獲取成員結構的日期或時間數據

03

public void set​(int field,int value)

普通

設置指定成員結構的數據內容

04

public abstract void add​(int field, int amount)

普通

在指定的結構上進行加法計算

05

 

普通

 

06

 

普通

 

07

 

普通

 

08

 

普通

 

09

 

普通

 

10

 

普通

 

         Calendar類之中的兩個構造方法都使用protected方文權限,則意味着這兩個構造方法只可以被同一包以及不一樣包的子類所訪問。 若是想要得到本類對象最佳的作法就是經過getInstance()方法完成。

 

範例:經過Calendar類獲取對象實例

import java.util.Calendar;;

publicclass Demo {

    publicstaticvoid main(String args[]) {

        Calendar calendar = Calendar.getInstance();     //獲取對象實例

        System.out.println(String.format("當前的日期時間格式: %s-%s-%s %s:%s:%s",

                calendar.get (calendar.YEAR),

                calendar.get(Calendar.MONTH) + 1,

                calendar.get(Calendar.DAY_OF_MONTH),

                calendar.get(Calendar.HOUR_OF_DAY),

                calendar.get(Calendar .MINUTE),

                calendar.get(Calendar.SECOND)));

    }

}

 

程序執行結果:

當前的日期時間格式: 2020-3-29 14:30:25

         可是獲取當前的日期時間並非Calendar的主要做用,這個類主要使用是爲了日曆的計算。

範例:實現日期的準確計算

import java.util.Calendar;;

publicclass Demo {

    publicstaticvoid main(String args[]) {

        Calendar calendar = Calendar.getInstance();     //獲取對象實例

        calendar.add(Calendar.YEAR, 30); //計算30年以後的日期

        calendar.add(Calendar.MONTH, 6); //計算半年以後的日期

        System.out.println(String.format("當前的日期時間格式: %s-%s-%s %s:%s:%s",

                calendar.get (calendar.YEAR),

                calendar.get(Calendar.MONTH) + 1,

                calendar.get(Calendar.DAY_OF_MONTH),

                calendar.get(Calendar.HOUR_OF_DAY),

                calendar.get(Calendar .MINUTE),

                calendar.get(Calendar.SECOND)));

    }

}

 

程序執行結果:

當前的日期時間格式: 2050-9-29 14:38:19

         若是此時沒有采用這樣的操做類進行日期的計算處理,二十使用long進行計算,那麼所獲得的日期時間必定是不許確的。既然Calendar描述的是一個日期結構,就能夠考慮進行一些日期上的調用。

範例:找到8月的最後一天

import java.util.Calendar;;

publicclass Demo {

    publicstaticvoid main(String args[]) {

        Calendar calendar = Calendar.getInstance();     //獲取對象實例

        calendar.set(calendar.get(calendar.YEAR), 8, 1);    //經過9月的第一天來找8月的最後一天

        calendar.add(Calendar.DATE, -1);

        System.out.println(String.format("當前的日期時間格式: %s-%s-%s %s:%s:%s",

                calendar.get (Calendar.YEAR),

                calendar.get(Calendar.MONTH) + 1,

                calendar.get(Calendar.DAY_OF_MONTH),

                calendar.get(Calendar.HOUR_OF_DAY),

                calendar.get(Calendar .MINUTE),

                calendar.get(Calendar.SECOND)));

    }

}

程序執行結果:

當前的日期時間格式: 2020-8-31 14:49:52

         若是想要進行指定日期最後一天的計算操做,就應該定位到指定的日期上,隨後在利用一些加減從操做獲取日期數據。本範例是先將日期設置到9月的第一天,在利用add()方法在天數上作一個減一操做,就變爲了8月的最後一天。

 

 

SimpleDateFormat

         使用Date類過去日期時間要比使用Calendar類獲取的日期時間更加的簡單(Calendar類的功能不在於數據的獲取,二十在日期的計算上),可是Date類中獲取的日期時間不方便閱讀。因此在實際項目的開服過程當中會存在一種格式化日期的處理操做,而這種處理操做主要依靠的是java.text.SimpleDateFormat類完成。

有以下的中音號的操做方法

No.

方法名稱

類型

描述

01

public final String format​(Date date)

普通

將日期格式化爲字符串

02

public Date parse​(String source)

throws ParseException

普通

將字符串轉化爲日期

03

public SimpleDateFormat​(String pattern)

普通

實例化SimpleDateFormat類對象,並設置匹配模式

04

 

普通

 

05

 

普通

 

         要想成功的對日期進行格式化或者將字符串轉化爲日期,那麼就必需要存在有一個日期時間的匹配表達式,而這組變道時裏面最重要的是幾個日期時間的單位:年(yyyy)、月(MM)、日(dd)、時(HH)、分(mm)、秒(ss)、毫秒(SSS)

 

範例:格式化日期時間(將Date轉化爲String)

import java.text.SimpleDateFormat;

import java.util.Date;;

publicclass Demo {

    publicstaticvoid main(String args[]) {

        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss.SSS");    //實例化轉化類對象

        String str = sdf.format(date);      //將日期時間轉化爲字符串

        System.out.println(str);

    }

}

程序執行結果:

2020-03-29-16-59-53.038

         此時得到的日期時間的字符串信息就符合你們的使用習慣了,採用相似的匹配表達式,也能夠實現字符串轉爲日期時間的處理。

範例:字符串轉日期時間(String—>Date)

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;;

publicclass Demo {

    publicstaticvoid main(String args[]) throws ParseException {

        String str = "2020-03-29-16-59-53.038";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss.SSS");    //實例化轉化類對象

        Date date = sdf.parse(str);     //將日期時間轉化爲字符串

        System.out.println(date);

    }

}

程序執行結果:

Sun Mar 29 16:59:53 CST 2020

在進行項目的開發過程當中,在進行數據輸入的時候所有的數據信息都是字符串類型,那麼就須要依據目標的需求進行數據類型的轉換,這樣的轉化操做會很是常見。

         針對實際的開發作出完整的總結:根據給定的結構圖形強記下來就能夠在實際的項目開發之中進行應用,而這些基本的只是時保證能夠編寫出項目的基本功。

常見的數據類型轉化表

 

LocalDate類(最新的時間操做類)

         在JDK1.8以後的版本中,Java追加了一個新的日期時間的處理包:Java.time,在這個包中提供有三個主要的類型:LocalDate、LocalTime、LocalDateTime。能夠經過這些類更加簡單的進行日期、時間或日期時間的處理,相比較以前的Calendar類來說,這些類的使用更加方便。

範例:獲取當前的日期時間

import java.text.ParseException;

import java.time.LocalDate;

import java.time.LocalDateTime;

import java.time.LocalTime;

publicclass Demo {

    publicstaticvoid main(String args[]) throws ParseException {

        LocalDate localDate = LocalDate.now();  //獲取當前的日期

        LocalTime localTime = LocalTime.now();  //獲取當前的時間

        LocalDateTime localDateTime = LocalDateTime.now();  //獲取當前的日期時間。

        System.out.println("LocalDate實例化對象輸出】" + localDate);

        System.out.println("LocalTime實例化對象輸出】" + localTime);

        System.out.println("LocalDateTime實例化對象輸出】" + localDateTime);

    }

}

 

程序執行結果:

【LocalDate實例化對象輸出】2020-03-29

【LocalTime實例化對象輸出】18:20:28.001

【LocalDateTime實例化對象輸出】2020-03-29T18:20:28.001

         能夠發現,每個日期時間類裏面都會存在有一個now()方法,這個方法能夠直接獲取當前系統的日期時間,而且在輸出這些對象的時候均可以獲得很是明確的信息內容。

         在java.time包中最爲重要的類是LocalDate類,這個類除了能夠直接理工對象的toString()方法獲取日期時間以外,也能夠針對年、月、日等數據分開獲取。

範例:經過LocalDate獲取詳細的日期數據

import java.text.ParseException;

import java.time.LocalDate;

import java.time.temporal.ChronoField;

publicclass Demo {

    publicstaticvoid main(String args[]) throws ParseException {

        LocalDate today = LocalDate.now();  //獲取當前的日期

        System.out.println(String.format("【當前日期】:%s-%s-%s", today.getYear(),today.getMonthValue(),today.getDayOfMonth()));

        System.out.println("【獲取一週的時間數】" + today.getDayOfWeek().getValue());

        System.out.println("【今天是今年的第多少周】" + today.get(ChronoField.ALIGNED_WEEK_OF_YEAR));

        System.out.println("【今天是本月的第多少周】" + today.get(ChronoField.ALIGNED_WEEK_OF_MONTH));

        System.out.println("【今天是一年的第幾天】" + today.getDayOfYear());

    }

}

程序執行結果:

【當前日期】:2020-3-29

【獲取一週的時間數】7

【今天是今年的第多少周】13

【今天是本月的第多少周】5

【今天是一年的第幾天】89

         一樣都屬於日期的處理,可是能夠明顯感受到經過LocalDate要比直接使用Calendar類處理更加的簡單,使用LocalDate還能夠很是方便的判斷某一個日期所在的年是否爲閏年。

範例:判斷閏年

import java.text.ParseException;

import java.time.LocalDate;

publicclass Demo {

    publicstaticvoid main(String args[]) throws ParseException {

        LocalDate localDate = LocalDate.parse("1999-04-27");    //操做指定日期

        System.out.println("【閏年判斷】" + localDate.isLeapYear());

        System.out.println("【所處在周幾】" + localDate.getDayOfWeek());

    }

}

程序執行結果:

【閏年判斷】false

【所處在周幾】TUESDAY

         在使用LocalDate類進行日期處理的時候,最爲強大的功能是能夠直接進行日期的計算處理,例如:得到所在月的第一天,或者是最後一天等信息。

範例:經過LocalDate進行日期推算

import java.text.ParseException;

import java.time.DayOfWeek;

import java.time.LocalDate;

import java.time.temporal.TemporalAdjusters;

publicclass Demo {

    publicstaticvoid main(String args[]) throws ParseException {

        LocalDate localDate = LocalDate.parse("1999-04-27");    //操做指定日期

        System.out.println("【所在月的第一天】" + localDate.with(TemporalAdjusters.firstDayOfMonth()));

        System.out.println("【所在月的第三天】" + localDate.withDayOfMonth(3));

        System.out.println("【所在月的最後一天】" + localDate.with(TemporalAdjusters.lastDayOfMonth()));

        System.out.println("300月後的日期】" + localDate.plusMonths(300));

        System.out.println("【日期所處月的第一個週一】" + localDate.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));

        System.out.println("【日期所處年的第一個週一】" + localDate.withMonth(1).with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));

    }

}

程序執行結果:

【所在月的第一天】1999-04-01

【所在月的第三天】1999-04-03

【所在月的最後一天】1999-04-30

【300月後的日期】2024-04-27

【日期所處月的第一個週一】1999-04-05

【日期所處年的第一個週一】1999-01-04

         經過以上的一系列分析以後就能夠發現,在進行日期數據的處理上,實際上使用LocalDate類要比直接使用Calendar類更加的簡單,同時這個類也屬於新時代的類。儘可能使用新的技術,old技術早晚會被淘汰

多線程操做下的日期時間格式化

         經過前面的學習獲得結論:若是想要將日期準華爲字符串則確定要使用SimpleDateFormat類完成,同理,將字符串格式化爲日期也必定要使用SimpleDateFormat類,因而這個類幾乎就成爲了全部項目開發中必然要採用的工具類。

下面來針對於這個工具類的使用進行一些多線程環境下的分析。

範例:觀察單一線程下的SimpleDateFormat類的操做

相關文章
相關標籤/搜索