1. 程式人生 > >Java、Oracle、JSP中的時間轉換、獲取與操作

Java、Oracle、JSP中的時間轉換、獲取與操作

Java中的時間格式轉換:

說在前面:

1.UTC:協調世界時,又稱世界標準時間或世界協調時間,簡稱UTC(從英文“Coordinated Universal Time”/法文“TempsUniversel Coordonné”而來),是最主要的世界時間標準

2.CST:北京時間,China Standard Time,中國標準時間。在時區劃分上,屬東八區,比協調世界時早8小時,記為UTC+8。不過這個CST這個縮寫比較糾結的是它可以同時代表四個不同的時間:

        Central Standard Time (USA) UT-6:00
        Central Standard Time (Australia) UT+9:30


        China Standard Time UT+8:00

        Cuba Standard Time UT-4:00

Java Date使用UTC時間,如 Tue Jan 05 14:28:41 CST 2016 表示China Standard Time UT+8:00

日期字串中的引數含義:

字母日期或時間元素型別示例
GEra 標誌符TextAD
y年份Number1996; 96
M年份中的月份TextJuly; Jul; 07
w年份中的週數Number27
W月份中的週數Number2
D年份中的天數Number189
d月份中的天數Number10
F月份中的星期Number2
E星期中的天數TextTuesday; Tue
aAm/pm 標記TextPM
H一天中的小時數(0-23)Number0
k一天中的小時數(1-24)Number24
Kam/pm 中的小時數(0-11)Number0
ham/pm 中的小時數(1-12)Number12
m小時中的分鐘數Number30
s分鐘中的秒數Number55
S毫秒數Number978
z時區General time zonePacific Standard Time; PST; GMT-08:00
Z時區RFC 822 time zone-0800

宣告:

        parse方法是將時間字串轉換成時間物件;format方法是將時間物件轉換成時間字串;

        時間字串一般有以下幾種:

一般樣式:
	"yyyy-MM-dd HH:mm:ss"、"yyyy年MM月dd日 HH時mm分ss秒"
帶有時區樣式:
	"yyyy-MM-dd'T'HH:mm:ss'Z'"
系統預設樣式:
	"EEE MMM dd HH:mm:ss z yyyy"

       其中預設樣式轉換時,需要多加一個引數new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH)

        new出來的Date是沒有格式的,輸出的時候是呼叫了其toString的方法,格式如下:

Date now=new Date();
System.out.println(now);
Wed May 23 23:05:01 CST 2018
  • 將時間物件轉換為固定的時間字串(物件與字串的轉換需要使用SimpleDateFormat)
		Date now = new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(sdf.format(now));
2018-05-23 23:09:25
  • 將時間字串轉換成時間物件
		String dateStr="2018/05/23 23:09:25";
		SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		Date date=sdf1.parse(dateStr);
		System.out.println(date);
Wed May 23 23:09:25 CST 2018

這時候的date則按照預設的格式輸出了,所以date物件則是從時間字串物件轉換成了時間物件

  • 從某種格式時間字串(yyyy-MM-dd'T'HH:mm:ss'Z')到指定格式時間字串(yyyy/MM/dd HH:mm:ss)
		String dateStr2="2017-01-22T17:33:18Z";
		SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
		System.out.println(sdf1.format(sdf2.parse(dateStr2)));
2017/01/22 17:33:18
  • 毫秒數轉換成時間物件
		long time=System.currentTimeMillis();
		System.out.println("time:"+time);
		Date date=new Date(time);
		System.out.println("date:"+date);
time:1527089133265
date:Wed May 23 23:25:33 CST 2018

上面的時間按照固定的時間字串格式輸出了,所以轉換成功。

  • 時間物件獲取毫秒數
		Date date1=new Date();
		System.out.println("time:"+date1.getTime());
time:1527089276078
Java中的時間操作:

獲取時間中年、月、日等屬性或者已有時間上增加一年、減少一天等亦或通過兩個時間計算相關值,用Calendar最好。

  • 獲取時間的某個屬性
        Calendar now = Calendar.getInstance();  
        System.out.println("年: " + now.get(Calendar.YEAR));  
        System.out.println("月: " + (now.get(Calendar.MONTH) + 1) + "");  
        System.out.println("日: " + now.get(Calendar.DAY_OF_MONTH));  
        System.out.println("時: " + now.get(Calendar.HOUR_OF_DAY));  
        System.out.println("分: " + now.get(Calendar.MINUTE));  
        System.out.println("秒: " + now.get(Calendar.SECOND)); 
年: 2018
月: 5
日: 24
時: 23
分: 24
秒: 45
  • 已有時間上增加或減少時間
        Calendar now = Calendar.getInstance();  
        System.out.println("原時間:"+now.getTime());  
        now.add(Calendar.YEAR, 1);
        System.out.println("上個時間加一年時間:"+now.getTime());
        now.add(Calendar.DAY_OF_MONTH, -1);
        System.out.println("上個時間減一天時間:"+now.getTime());
原時間:Thu May 24 22:59:43 CST 2018
上個時間加一年時間:Fri May 24 22:59:43 CST 2019
上個時間減一天時間:Thu May 23 22:59:43 CST 2019
  • 通過時間計算年齡
	//計算年齡方法
	public static String getAge(Date birthDay,Date EndDay) throws Exception {
        Calendar cal = Calendar.getInstance();
        //設定到哪天計算出年齡
        cal.setTime(EndDay);
        if (cal.before(birthDay)) {
            throw new IllegalArgumentException(
                "The birthDay is before Now.It's unbelievable!");
        }
        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH);
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        
        //設定出生日期
        cal.setTime(birthDay);
 
        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
 
        int age = yearNow - yearBirth;
 
        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) age--;
            }else{
                age--;
            }
        }
        return Integer.toString(age);
    }
		System.out.println("今年的年齡:"+getAge(new SimpleDateFormat("yyyy-MM-dd").parse("1999-09-09"), new Date()));
		System.out.println("2022年的年齡:"+getAge(new SimpleDateFormat("yyyy-MM-dd").parse("1999-09-09"), 
				new SimpleDateFormat("yyyy-MM-dd").parse("2022-01-01")));
今年的年齡:18
2022年的年齡:22
Oracle中的時間格式轉換:
  • 時間物件轉時間字串
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;

  • 時間字串轉時間物件
select to_date('2022-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;


Oracle中的時間操作:
  • 獲取時間的某個屬性
select to_char(sysdate,'yyyy') as year,to_char(sysdate,'mm') as month,to_char(sysdate,'dd') as nowDay from dual;

加法 
select sysdate,add_months(sysdate,12) from dual;        --加1年 
select sysdate,add_months(sysdate,1) from dual;        --加1月 
select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1星期 
select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1天 
select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1小時 
select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1分鐘 
select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1秒 
減法 
select sysdate,add_months(sysdate,-12) from dual;        --減1年 
select sysdate,add_months(sysdate,-1) from dual;        --減1月 
select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;  --減1星期 
select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;  --減1天 
select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --減1小時 
select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --減1分鐘 
select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --減1秒
JSP中的時間轉換:

使用JSTL:

        檢視JSTL的fmt標籤的使用

使用JavaScript:

  • 時間物件轉時間字串

需要自己定義一個方法,然後呼叫:

// 時間格式方法
Date.prototype.format = function(fmt) {
    var o = {
        "M+" : this.getMonth()+1, //月份
        "d+" : this.getDate(), //日
        "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小時
        "H+" : this.getHours(), //小時
        "m+" : this.getMinutes(), //分
        "s+" : this.getSeconds(), //秒
        "q+" : Math.floor((this.getMonth()+3)/3), //季度
        "S" : this.getMilliseconds() //毫秒
    };
    if(/(y+)/.test(fmt)) {
        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
    }
    for(var k in o) {
        if(new RegExp("("+ k +")").test(fmt)){
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
        }
    }
    return fmt;
}
var timeFromStr=new Date().format("yyyy-MM-ddTHH:mm:ssZ");
用的時候直接呼叫上面定義的方法,Solr的時間格式如上,是有時區的。在java中,格式字串為"yyyy-MM-dd'T'HH:mm:ss'Z'",而在js中則需要去掉單引號,不然會單引號會依然存在在js解析後的內容中。
  • 時間字串轉時間物件
var date1=new Date("2018-01-01");
var date2=new Date("2018/01/01");
console.log(date1);
console.log(date2);
Mon Jan 01 2018 08:00:00 GMT+0800 (中國標準時間)
Mon Jan 01 2018 00:00:00 GMT+0800 (中國標準時間)

這裡需要特別說明的是,上面兩種的解析結果會不同,第一個中間用“-”的解析出的結果會多出8個小時來。這可能是與預設時間配置有關,我的處理辦法是在時間字串放入引數之前將“-”使用.replace("-","/")進行字串處理,然後在解析;

JavaScript中的時間操作:
var date=new Date(date.setMonth(date.getMonth()+1));
var timeToStr=date.format("yyyy-MM-ddTHH:mm:ssZ");
上面程式碼為當前時間加一月