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
日期字串中的引數含義:
字母 | 日期或時間元素 | 型別 | 示例 |
---|---|---|---|
G | Era 標誌符 | Text | AD |
y | 年份 | Number | 1996; 96 |
M | 年份中的月份 | Text | July; Jul; 07 |
w | 年份中的週數 | Number | 27 |
W | 月份中的週數 | Number | 2 |
D | 年份中的天數 | Number | 189 |
d | 月份中的天數 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天數 | Text | Tuesday; Tue |
a | Am/pm 標記 | Text | PM |
H | 一天中的小時數(0-23) | Number | 0 |
k | 一天中的小時數(1-24) | Number | 24 |
K | am/pm 中的小時數(0-11) | Number | 0 |
h | am/pm 中的小時數(1-12) | Number | 12 |
m | 小時中的分鐘數 | Number | 30 |
s | 分鐘中的秒數 | Number | 55 |
S | 毫秒數 | Number | 978 |
z | 時區 | General time zone | Pacific 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");
上面程式碼為當前時間加一月