Java api 入門教程 之 JAVA的Date類與Calendar類

来源:http://www.cnblogs.com/liuhongfeng/archive/2016/02/04/5175100.html
-Advertisement-
Play Games

在JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期處理。 一、這裡簡單介紹一下Date類的使用。 1、使用Date類代表當前系統時間 Date d = new Date(); System.o


在JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期處理。

 

一、這裡簡單介紹一下Date類的使用。

 

1、使用Date類代表當前系統時間

 Date d = new Date();

System.out.println(d);

使用Date類的預設構造方法創建出的對象就代表當前時間,由於Date類覆蓋了toString方法,所以可以直接輸出Date類型的對象,顯示的結果如下:

Sun Mar 08 16:35:58 CST 2009

在該格式中,Sun代表Sunday(周日),Mar代表March(三月),08代表8號,CST代表China Standard Time(中國標準時間,也就是北京時間(東八區))。

 

2、使用Date類代表指定的時間

Date d1 = new Date(2009-1900,3-1,9);

System.out.println(d1);

使用帶參數的構造方法,可以構造指定日期的Date類對象,Date類中年份的參數應該是實際需要代表的年份減去1900,實際需要代表的月份減去1以後的值。例如上面的示例代碼代表就是2009年3月9號。

實際代表具體的年月日時分秒的日期對象,和這個類似。

 

3、獲得Date對象中的信息

                   Date d2 = new Date();

                   //年份

                   int year = d2.getYear() + 1900;

                   //月份

                   int month = d2.getMonth() + 1;

                   //日期

                   int date = d2.getDate();

                   //小時

                   int hour = d2.getHours();

                   //分鐘

                   int minute = d2.getMinutes();

                   //秒

                   int second = d2.getSeconds();

                   //星期幾

                   int day = d2.getDay();

                   System.out.println("年份:" + year);

                   System.out.println("月份:" + month);

                   System.out.println("日期:" + date);

                   System.out.println("小時:" + hour);

                   System.out.println("分鐘:" + minute);

                   System.out.println("秒:" + second);

                   System.out.println("星期:" + day);

使用Date類中對應的get方法,可以獲得Date類對象中相關的信息,需要註意的是使用getYear獲得是Date對象中年份減去1900以後的值,所以需要顯示對應的年份則需要在返回值的基礎上加上1900,月份類似。在Date類中還提供了getDay方法,用於獲得Date對象代表的時間是星期幾,Date類規定周日是0,周一是1,周二是2,後續的依次類推。

 

4、Date對象和相對時間之間的互轉

                  Date d3 = new Date(2009-1900,3-1,10);

                   long time = 1290876532190L;

                   //將Date類的對象轉換為相對時間

                   long t = d3.getTime();

                   System.out.println(t);

                   //將相對時間轉換為Date類的對象

                   Date d4 = new Date(time);

                   System.out.println(d4);

使用Date對象中的getTime方法,可以將Date類的對象轉換為相對時間,使用Date類的構造方法,可以將相對時間轉換為Date類的對象。經過轉換以後,既方便了時間的計算,也使時間顯示比較直觀了。

 

二、Calendar類

從JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實現。在設計上,Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要複雜一些,下麵就介紹一下Calendar類的使用。

Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程式員來說是透明的,只需要使用getInstance方法創建即可。

 

1、使用Calendar類代表當前時間

Calendar c = Calendar.getInstance();

由於Calendar類是抽象類,且Calendar類的構造方法是protected的,所以無法使用Calendar類的構造方法來創建對象,API中提供了getInstance方法用來創建對象。

使用該方法獲得的Calendar對象就代表當前的系統時間,由於Calendar類toString實現的沒有Date類那麼直觀,所以直接輸出Calendar類的對象意義不大。

 

2、使用Calendar類代表指定的時間

 Calendar c1 = Calendar.getInstance();

 c1.set(2009, 3 - 1, 9);

使用Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後再設定該對象中的年月日參數來完成。

set方法的聲明為:

public final void set(int year,int month,int date)

以上示例代碼設置的時間為2009年3月9日,其參數的結構和Date類不一樣。Calendar類中年份的數值直接書寫,月份的值為實際的月份值減1,日期的值就是實際的日期值。

如果只設定某個欄位,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

在該方法中,參數field代表要設置的欄位的類型,常見類型如下:

         Calendar.YEAR——年份

         Calendar.MONTH——月份

         Calendar.DATE——日期

         Calendar.DAY_OF_MONTH——日期,和上面的欄位完全相同

         Calendar.HOUR——12小時制的小時數

         Calendar.HOUR_OF_DAY——24小時制的小時數

         Calendar.MINUTE——分鐘

         Calendar.SECOND——秒

         Calendar.DAY_OF_WEEK——星期幾

後續的參數value代表,設置成的值。例如:

         c1.set(Calendar.DATE,10);

該代碼的作用是將c1對象代表的時間中日期設置為10號,其它所有的數值會被重新計算,例如星期幾以及對應的相對時間數值等。

 

3、獲得Calendar類中的信息

                   Calendar c2 = Calendar.getInstance();

                   //年份

                   int year = c2.get(Calendar.YEAR);

                   //月份

                   int month = c2.get(Calendar.MONTH) + 1;

                   //日期

                   int date = c2.get(Calendar.DATE);

                   //小時

                   int hour = c2.get(Calendar.HOUR_OF_DAY);

                   //分鐘

                   int minute = c2.get(Calendar.MINUTE);

                   //秒

                   int second = c2.get(Calendar.SECOND);

                   //星期幾

                   int day = c2.get(Calendar.DAY_OF_WEEK);

                   System.out.println("年份:" + year);

                   System.out.println("月份:" + month);

                   System.out.println("日期:" + date);

                   System.out.println("小時:" + hour);

                   System.out.println("分鐘:" + minute);

                   System.out.println("秒:" + second);

                   System.out.println("星期:" + day);

使用Calendar類中的get方法可以獲得Calendar對象中對應的信息,get方法的聲明如下:

 public int get(int field)

其中參數field代表需要獲得的欄位的值,欄位說明和上面的set方法保持一致。需要說明的是,獲得的月份為實際的月份值減1,獲得的星期的值和Date類不一樣。在Calendar類中,周日是1,周一是2,周二是3,依次類推。

 

4、其它方法說明

其實Calendar類中還提供了很多其它有用的方法,下麵簡單的介紹幾個常見方法的使用。

 

a、add方法

public abstract void add(int field,int amount)

該方法的作用是在Calendar對象中的某個欄位上增加或減少一定的數值,增加是amount的值為正,減少時amount的值為負。

         例如在計算一下當前時間100天以後的日期,代碼如下:

                   Calendar c3 = Calendar.getInstance();

                   c3.add(Calendar.DATE, 100);

                   int year1 = c3.get(Calendar.YEAR);

                   //月份

                   int month1 = c3.get(Calendar.MONTH) + 1;

                   //日期

                   int date1 = c3.get(Calendar.DATE);

                   System.out.println(year1 + "年" + month1 + "月" + date1 + "日");

這裡add方法是指在c3對象的Calendar.DATE,也就是日期欄位上增加100,類內部會重新計算該日期對象中其它各欄位的值,從而獲得100天以後的日期,例如程式的輸出結果可能為:

                   2009年6月17日

 

b、after方法

                   public boolean after(Object when)

該方法的作用是判斷當前日期對象是否在when對象的後面,如果在when對象的後面則返回true,否則返回false。例如:

                   Calendar c4 = Calendar.getInstance();

                   c4.set(2009, 10 - 1, 10);

                   Calendar c5 = Calendar.getInstance();

                   c5.set(2010, 10 - 1, 10);

                   boolean b = c5.after(c4);

                   System.out.println(b);

在該示例代碼中對象c4代表的時間是2009年10月10號,對象c5代表的時間是2010年10月10號,則對象c5代表的日期在c4代表的日期之後,所以after方法的返回值是true。

另外一個類似的方法是before,該方法是判斷當前日期對象是否位於另外一個日期對象之前。

 

c、getTime方法

public final Date getTime()

該方法的作用是將Calendar類型的對象轉換為對應的Date類對象,兩者代表相同的時間點。

類似的方法是setTime,該方法的作用是將Date對象轉換為對應的Calendar對象,該方法的聲明如下:

         public final void setTime(Date date)

轉換的示例代碼如下:

                  Date d = new Date();

                   Calendar c6 = Calendar.getInstance();

                   //Calendar類型的對象轉換為Date對象

                   Date d1 = c6.getTime();

                   //Date類型的對象轉換為Calendar對象

                   Calendar c7 = Calendar.getInstance();

                   c7.setTime(d);

 

5、Calendar對象和相對時間之間的互轉

                            Calendar c8 = Calendar.getInstance();

                            long t = 1252785271098L;

                            //將Calendar對象轉換為相對時間

                            long t1 = c8.getTimeInMillis();

                            //將相對時間轉換為Calendar對象

                            Calendar c9 = Calendar.getInstance();

                            c9.setTimeInMillis(t1);

在轉換時,使用Calendar類中的getTimeInMillis方法可以將Calendar對象轉換為相對時間。在將相對時間轉換為Calendar對象時,首先創建一個Calendar對象,然後再使用Calendar類的setTimeInMillis方法設置時間即可。

 

三、應用示例

下麵以兩個簡單的示例介紹時間和日期處理的基本使用。

 

1、計算兩個日期之間相差的天數

例如計算2010年4月1號和2009年3月11號之間相差的天數,則可以使用時間和日期處理進行計算。

該程式實現的原理為:首先代表兩個特定的時間點,這裡使用Calendar的對象進行代表,然後將兩個時間點轉換為對應的相對時間,求兩個時間點相對時間的差值,然後除以1天的毫秒數(24小時X60分鐘X60秒X1000毫秒)即可獲得對應的天數。實現該示例的完整代碼如下:

 import java.util.*;

/**

 * 計算兩個日期之間相差的天數

 */

public class DateExample1 {

         public static void main(String[] args) {

                   //設置兩個日期

                   //日期:2009年3月11號

                   Calendar c1 = Calendar.getInstance();

                   c1.set(2009, 3 - 1, 11);

                   //日期:2010年4月1號

                   Calendar c2 = Calendar.getInstance();

                   c2.set(2010, 4 - 1, 1);

                   //轉換為相對時間

                   long t1 = c1.getTimeInMillis();

                   long t2 = c2.getTimeInMillis();

                   //計算天數

                   long days = (t2 - t1)/(24 * 60 * 60 * 1000);

                   System.out.println(days);

         }

}

 

2、輸出當前月的月曆

該示例的功能是輸出當前系統時間所在月的日曆,例如當前系統時間是2009年3月10日,則輸出2009年3月的日曆。

該程式實現的原理為:首先獲得該月1號是星期幾,然後獲得該月的天數,最後使用流程式控制制實現按照日曆的格式進行輸出即可。即如果1號是星期一,則列印一個單位的空格,如果1號是星期二,則列印兩個單位的空格,依次類推。列印完星期六的日期以後,進行換行。

實現該示例的完整代碼如下:

 

import java.util.*;

/**

 * 輸出當前月的日曆

 */

public class DateExample2{

         public static void main(String[] args){

                   //獲得當前時間

                   Calendar c = Calendar.getInstance();

                   //設置代表的日期為1號

                   c.set(Calendar.DATE,1);

                   //獲得1號是星期幾

                   int start = c.get(Calendar.DAY_OF_WEEK);

                   //獲得當前月的最大日期數

                   int maxDay = c.getActualMaximum(Calendar.DATE);   

                   //輸出標題

                   System.out.println("星期日 星期一 星期二 星期三 星期四 星期五   星期六");

                   //輸出開始的空格

                   for(int i = 1;i < start;i++){

                            System.out.print("      "); 

                   }

                   //輸出該月中的所有日期

                   for(int i = 1;i <= maxDay;i++){

                            //輸出日期數字

                            System.out.print(" " + i);

                            //輸出分隔空格

                            System.out.print("     ");

                            if(i < 10){

                                     System.out.print(' ');

                            }

                            //判斷是否換行

                            if((start + i - 1) % 7 == 0){

                                     System.out.println();       

                            }

                   }

                   //換行

                   System.out.println();       

         }       

}

 

關於時間和日期的處理就介紹這麼多,更多的實現方法還需要根據具體問題進行對應的實現。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:本文是【ASP.NET Identity系列教程】的第二篇。本系列教程詳細、完整、深入地介紹了微軟的ASP.NET Identity技術,描述瞭如何運用ASP.NET Identity實現應用程式的用戶管理,以及實現應用程式的認證與授權等相關技術,譯者希望本系列教程能成為掌握ASP.NET Id
  • 一、修改數據 其實修改涉及的內容挺多的,是相對於其他操作來說比較繁瑣。也是本文的重頭戲。 雖然都是基礎內容,但是也是值得細細品味的。 1、最簡單直接的修改數據就是從資料庫里檢索出數據修改相應的欄位即可 數據表: Code: using (var db = new ApplicationDbConte
  • 有時候我們需要編寫一些迎合IOS用戶使用習慣的uwp應用,我在這裡整理一下仿IOS頁面切換效果的代碼。 先分析IOS的頁面切換。用戶使用左右滑動方式進行前進和後退,播放類似於FlipView的切換動畫。導航到新頁面時,使用頁面前進的動畫。 UWP自帶很多切換效果,位於 Windows.UI.Xaml...
  • 當我們向GlobalConfiguration.Configuration.MessageHandlers添加一個DelegatingHandler派生類後,很容易發生即使命中了Action,但方法參數值為null的問題。
  • 在文章《Python程式員從小白到大神必讀資料彙總(一)到(三)》裡面介紹了基礎學習資料和一點點的進階資料,今天小編收集了5篇帶有實例乾貨的資料,趕緊來看看吧!另外,喜歡寫博客的博主可以申請加工程師博主交流群:391519124,分享你的博文,和大牛們一起交流技術~ 一、GitHub上有趣的pyth
  • 修改haproxy配置文件 基本功能:1.獲取記錄2.添加記錄3.刪除記錄 代碼結構:三個函數一個主函數 知識點:1.python簡單數據結構的使用:列表、字典等 2.python兩個模塊的使用:os和json a.os.rename('文件1','文件2') b.json完成自動識別字典、列表,並
  • 直接用set就行,比如: l = [1, 1, 2, 2, 3, 4, 5] s = set(l) c = [i for i in s] print c 結果為: [1, 2, 3, 4, 5] 其中第三行利用了python的列表生成式
  • 外部腳本 在這個認證模塊中,當ejabberd啟動,它將啟動一個腳本去調用它的認證任務. 服務管理員可以使用任何的變成語言去編寫外部腳本,ejabberd與腳本之間的介面詳情的描述在ejabberd開髮指南中. 這裡也有一些認證腳本的實例. 鏈接:https://www.ejabberd.im/ex
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...