前言
寫後台程序的時候,經常需要存儲當前服務器的時間戳,使用時間戳也很方便,客戶端和服務器端都可以根據自己的需求做各自的轉換
在php裡,獲取當前時間戳使用time()函數,格式化輸出通過Date()函數即可,Java里相對複雜一些,這裡簡單介紹一下
Java語言中的Calendar,Date,DateFormat組成了Java標準的一個基本但是非常重要的部分。日期是商業邏輯計算一個關鍵的部分,所有的開發者都應該能計算未來的日期,定制日期的顯示格式,並將文本數據解析成日期對象
獲取UNIX時間戳
在JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期的處理。這裡簡單介紹一下用Date類如何獲取當前時間戳
使用系統的當前日期和時間創建一個日期對象並返回一個長整數,這個時間通常稱為Java 虛擬機(JVM)主機環境的系統時間,單位是毫秒,因此需要除以1000轉換成UNIX時間戳
import java.util.Date; public class TimeTest { public static void main(String args[]) { Date time = new Date(); System.out.println(time.getTime() / 1000); // 1387258105 System. out.println(time.toString()); // Tue Dec 17 13:28:25 CST 2013 } }
格式化日期
php裡可以使用Date()函數定制日期數據的格式用於呈現,Java裡需要調用SimpleDateFormat類,例如將當前時間格式化輸出:
import java.text.SimpleDateFormat; import java.util.Date; public class TimeTest { public static void main(String args[]) { Date time = new Date(); System.out.println(time.getTime() / 1000 ); // 1387260201 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); // 2013-03-17 14:03:21 String str = sdf.format(time); System.out .println(str); } }
將文本解析成日期對象
給定了格式化的時間字符串,例如“2013-12-17 14:05:59”,需要將其轉換成Date對象,便於獲取時間戳獲取進行其它格式化操作,可以繼續調用SimpleDateFormat類
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TimeTest { public static void main(String args[]) { String text = "2013-12-17 14:05:59 "; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date time = sdf.parse(text); System.out.println(time.getTime() / 1000); } catch(ParseException e) { System.out.println(e.getMessage()); } } }
獲取日期的特定部分
通過Date和SimpleDateFormat兩個類,我們已經可以實現獲取當前時間戳,日期格式化輸出,格式化日期字符串轉Date對像功能,現在還有一個新的需求,如何獲取日期的特定部分,例如當前的小時,當前的天數等,這就需要用到Calendar類了
import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class TimeTest { public static void main(String args[]) { Date date = new Date(); GregorianCalendar gcalendar = new GregorianCalendar( ); gcalendar.setTime(date); int year = gcalendar.get(Calendar.YEAR); int month = gcalendar.get(Calendar.MONTH); int day = gcalendar.get(Calendar.DAY_OF_MONTH); int hour = gcalendar. get(Calendar.HOUR_OF_DAY); int minute = gcalendar.get(Calendar.MINUTE); int second = gcalendar.get(Calendar.MINUTE); System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second); } }
計算兩個日期之間相差的天數
例如計算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);}}
輸出當前月的月曆
該示例的功能是輸出當前系統時間所在月的日曆,例如當前系統時間是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();}}