Java日期時間
Java.util包提供了Date類來封裝當前的日期和時間。Date類提供兩個構造函數來實例化Date對象。
第一個構造函數使用當前日期和時間來初始化對象。
Date()
第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。
Date(long millisec)
Date對象創建以后,可以調用下面的方法。
獲取當前日期時間
Java中獲取當前日期和時間很簡單,使用Date對象的toString()方法來打印當前日期和時間,如下所示:
package pkg2020華南虎; import java.util.Date; /** * * @author yl */ public class DateDemo { public static void main(String[] args) { //初始化Date對象 Date date=new Date(); //使用toString()函數顯示日期時間 System.out.println(date.toString()); } }
日期比較
Java使用以下三種方法來比較兩個日期:
- 使用getTime()方法獲取兩個日期(自從1970/01/01經歷的毫秒數值),然后比較這兩個值。
- 使用方法before(),after()和equals()。例如,一個月的12號比18號早,則new Date(99,2,12).before(new Date(99,2,18))返回值為true。
- 使用compareTo()方法,他是由Comparable接口定義的,Date類實現了這個接口。
package pkg2020華南虎; import java.util.Date; /** * * @author yl */ public class DateCompare { static Date date=new Date(); // static Date date=new Date(); // static double a=date.getTime(); public static void main(String[] args) { double a=date.getTime(); System.out.println(a); } }
package pkg2020華南虎; import java.util.Date; /** * * @author yl */ public class DateCompare02 { static Date a = new Date(1999 / 12 / 30); static Date b = new Date(1999 / 12 / 20); public static void main(String[] args) { int c = a.compareTo(b); System.out.println(c); } }
使用SimpleDateFormat格式化日期
使用SimpleDateFormat是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat允許你選擇任何用戶自定義日期時間格式來運行。例如:
package pkg2020華南虎; import java.util.Date; //import java.util.Scanner; //import java.util.*; import java.text.SimpleDateFormat; /** * * @author yl */ public class DateTest01 { public static void main(String[] args) { Date dateNow=new Date(); SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("Now time is:"+ft.format(dateNow)); } }
注意:有的格式大寫,有的格式小寫。例如MM是月份,mm是分鍾;HH是24小時制,hh是12小時制。
日期和時間的格式化編碼
時間模式字符串用來指定時間格式。在此模式中,所有的ASCII字母被保留為模式字母,定義如下:
使用printf格式化日期
printf方法可以很輕松地格式化時間和日期。使用兩個字母格式,它以%t開頭並且以下面表格中的一個字母結尾。
實例
package pkg2020華南虎; import java.util.Date; /** * * @author yl */ public class DateTest02 { public static void main(String[] args) { Date date = new Date(); //c的使用 System.out.printf("全部日期和時間信息:%tc%n", date); System.out.printf("年-月-日格式:%tF%n", date); System.out.printf("年/月/日格式:%tD%n", date); System.out.printf("hh:mm:ss PM格式:%tr%n", date); System.out.printf("HH:mm:ss SS格式:%tT%n", date); System.out.printf("HH:mm:%tR", date); } }
如果你需要重復提供日期,那么利用這種方式來格式化它的每一部分就有點 復雜了。因此,可以利用一個格式化字符串指出要被格式化的參數的索引。
索引必須緊跟在%后面,而且必須以$結束,例如:
package pkg2020華南虎; import java.util.Date; /** * * @author yl */ public class DateTest03 { public static void main(String[] args) { Date date=new Date(); System.out.printf("%1$s %2$tB %2$td,%2$tY","Due date:",date); } }
或者,你可以使用<標志。它表明先前被格式化的參數要被再次使用。例如:
import java.util.Date; public class DateDemo{ public static void main(String [] args){ Date date =new Date(); System.out.printf("%s %tB %<te,%<tY","Due date:",date); } }
定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串。這些日期轉換符如下所示:
解析字符串為時間
SimpleDateFormat類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat的對象的格式化存儲來解析字符串。例如:
package pkg2020華南虎; import java.util.Date; import java.text.SimpleDateFormat; import java.text.*; /** * * @author yl */ public class DateTest04 { public static void main(String[] args) { SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0];//三目運算符、for-each循環 System.out.print(input + "Parses as"); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } }
Java休眠(sleep)
sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CPU的使用,目的是不讓當前線程獨自霸占該進程所獲得的cpu資源,以留一定時間給其他線程執行的機會。
你可以讓程序休眠一毫秒的時間或者到你的計算機的壽命長的任意時間。例如,下面的程序會休眠三秒:
package pkg2020華南虎; import java.util.*; /** * * @author yl */ public class SleepDemo { public static void main(String[] args) { try { System.out.println(new Date() + "\n"); Thread.sleep(1000 * 3);//休眠3秒 System.out.println(new Date() + "\n"); } catch (Exception e) { System.out.println("Got an exception"); } } }
測量時間
下面的一個例子表明如何測量時間間隔(以毫秒為單位):
package pkg2020華南虎; import java.util.*; /** * * @author yl */ public class DiffDemo { public static void main(String[] args) { try { long start = System.currentTimeMillis(); System.out.println(new Date() + "\n"); Thread.sleep(5 * 60 * 10); System.out.println(new Date() + "\n"); long end = System.currentTimeMillis(); long diff = end - start; System.out.println("Difference is :" + diff); } catch (Exception e) { System.out.println("Got an exception!"); } } }
Calendar類
calendar n.日歷;歷法;日程表;一覽表 v.把。。。列入日程表
A.D. 公元、紀年 (Anno“年” Domini“主”)
B.C. 公元前 Before Christ
農歷 traditional Chinese calendar;lunar calendar
我們現在已經能夠格式化並創建一個日期對象,但是我們如何才能設置和獲取日期數據的特定部分,比如說小時,日,或者分鍾?我們又如何在日期的這些部分加上或者減去值呢?答案是使用Calendar類。
Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要復雜一些。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可。
創建一個代表系統當前日期的calendar對象
Calendar c=Calendar.getInstace();//默認是當前日期
創建一個指定日期的calendar對象
Calendar c1 =Calendar.getInstance(); c1.set(2009,6,12);
Calendar類對象字段類型
Calendar類中用以下這些常量表示不同的意義,jdk內的很多類其實都是采用的這種思想。
Calendar類對象信息的設置
Set設置
如:
Calendar c1=Calendar.getInstance();
調用
public final void set(int year,int month,int date)
c1.set(2009,6,12);//把Calendar對象c1的年月日分別設為:2009、6、12
利用字段型設置
如果只設定某個字段,例如日期的值,則可以使用如下set方法:
把c1對象代表的日期設置為10號,其他所有的數值會被重新計算。
把c1對象代表的年份設置為2008年,其他的所有數值會被重新計算。
public void set(int field,int value) c1.set(Calendar.DATE,10); c1.set(Calendar.Year,2008);
Add設置
Calendar c1=Calendar.getInstance(); c1.add(Calendar.DATE,10); c1.add(Calendar.DATE,-10);
把c1對象的日期加上10,也就是c1表示10天后的日期,其他所有的數值會被重新計算。
把c1對象的日期減去10,也就是c1表示10天前的日期,其他所有的數值會被重新計算。
Calendar類對象信息的獲得
Calendar c1=Calendar.getInstance(); int year=c1.get(Calendar.YEAR); int month=c1.get(Calendar.MONTH)+1; int date=c1.get(Calendar.DATE); int hour=c1.get(Calendar.HOUR_OF_DAY); int minute=c1.get(Calendar.MINUTE); int second=c1.get(Calendar.SECOND); int day=c1.get(Calendar.DAY_OF_WEEK);
注意:獲得星期幾與Date類是不同的:1代表星期日,2代表星期一,3代表星期二,以此類推。
GregorianCalendar類
Calendar類實現了公歷日歷,GregorianCalendar是Calendar類的一個具體實現。
Calendar的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。GregorianCalendar定義了兩個字段:A.D.(公元)和B.C.(公元前)。這是代表公歷定義的兩個時代。
實例
package pkg2020華南虎; import java.util.*; /** * * @author yl */ public class DateTest05 { public static void main(String[] args) { String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int year; // 初始化 Gregorian 日歷 // 使用當前時間和日期 // 默認為本地時間和時區 GregorianCalendar gcalendar = new GregorianCalendar(); // 顯示當前時間和日期的信息 System.out.print("Date: "); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time: "); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); // 測試當前年份是否為閏年 if(gcalendar.isLeapYear(year)) { System.out.println("當前年份是閏年"); } else { System.out.println("當前年份不是閏年"); } } }