Date類
java中用于描述日期的類桃漾。Date內(nèi)部維護著一個long值讯检,這個值表示的是1970-01-01 00:00:00到Date所表示的日期之間的毫秒值整袁。
import java.util.Date;
/**
* java中日期類Date
*/
public class DateTest {
public static void main(String[] args){
//創(chuàng)建一個Date實例,志膀,默認的構(gòu)造方法創(chuàng)建的日期代表當前系統(tǒng)時間
Date date = new Date();
/**
* 輸出date對象
* Tue Feb 27 08:27:54 GMT 2018(jdk1.5)
* GMT:格林威治時間,世界上計時流行的標志
* 中國所屬的時區(qū)為+8區(qū)鳖擒,所有要對時間上的小時+8
* Tue Feb 27 16:27:54 CST 2018(jdk1.6及以后)
* CST:中部標準時間,同時代表了下面4個時區(qū):
* CST Central Standard Time (USA) UT-6:00
* CST Central Standard Time (Australia) UT 9:30
* CST China Standard Time UT 8:00
* CST Cuba Standard Time UT-4:00
*/
System.out.println(date);//Thu Mar 14 13:56:34 CST 2019
//查看date內(nèi)部的毫秒值
long time = date.getTime();
System.out.println(time);//1552542994191
System.out.println(System.currentTimeMillis());//1552542994191
//設(shè)置一個一天后的當前時間溉浙,讓Date表示該日期
date.setTime(time+1000*60*60*24);
System.out.println(date);
/**
* 獲取當前年份
* 不推薦使用,會有千年蟲問題
* 對于日期的計算蒋荚,推薦使用Calendar類
*/
int year=date.getYear();
}
}
Calendar類
日歷類戳稽,Calendar不存在千年蟲問題。并且可以非常方便的計算日期期升。
import java.util.Calendar;
import java.util.Date;
/**
* 日歷類
*/
public class CalendarTest {
public static void main(String[] args){
/**
* 通過Calendar的靜態(tài)方法獲取一個實例
* 該方法會自行決定時區(qū)惊奇,幫我們創(chuàng)建Calendar實例
* 該方法會根據(jù)當前系統(tǒng)所在地區(qū)來決定時區(qū)
* 這里要注意,實際上根據(jù)不同的時區(qū)播赁,Calendar有若干個
* 子類實現(xiàn)颂郎。而Calendar本身是抽象類,不能實例化容为!
* 我們不需要關(guān)心創(chuàng)建的實例具體為哪個子類乓序,我們只需要根據(jù)
* Calendar規(guī)定的方法來使用就可以了寺酪。
*/
//構(gòu)造出來表示當前時間的日歷類
Calendar calendar = Calendar.getInstance();
/**
* 日歷類所解決的根本問題是簡化日期的計算
* 要想表示某個日期還應(yīng)使用Date描述
* Calendar是可以將其描述的時間轉(zhuǎn)化為Date的
* 我們只需要調(diào)用其getTime()方法就可以獲取描述的日期的
* Date對象了
*/
Date now = calendar.getTime();//獲取日歷所描述的日期
System.out.println(now);
//通過日歷類計算時間
/**
* 為日歷類設(shè)置時間
* 日歷類設(shè)置時間使用通用方法set
* set(int field,int value)
* fiele為時間分量:Calendar提供了相應(yīng)的常量值
* value:對應(yīng)的值
*/
//設(shè)置日歷表示2012年
calendar.set(Calendar.YEAR,2012);
/*
* 設(shè)置日歷表示11月,月份的值是從0開始的替劈,
* 所以0代表1月以此類推寄雀,也可以使用Calendar常量
*/
calendar.set(Calendar.MONTH,11-1);//Tue Feb 27 20:37:20 CST 2018
/**
* 設(shè)置日歷表示15號
* DAY_OF_MONTH 月里邊的天---號
* DAY_OF_WEEK 星期里的天---星期幾
* DAY_OF_YEAR 年里的天
*/
calendar.set(Calendar.DAY_OF_MONTH,15);
System.out.println(calendar.getTime());//Thu Nov 15 20:37:20 CST 2012
/**
* 想得知22天以后是哪天
*/
calendar.add(Calendar.DAY_OF_YEAR,22);
System.out.println(calendar.getTime());//Fri Dec 07 20:37:20 CST 2012
/**
* 想得知5天前是哪天
*/
calendar.add(Calendar.DAY_OF_YEAR,-5);
System.out.println(calendar.getTime());//Sun Dec 02 20:37:20 CST 2012
/**
* 想得知一個月后是哪天?
*/
calendar.add(Calendar.MONTH,1);
System.out.println(calendar.getTime());//Wed Jan 02 20:37:20 CST 2013
/**
* 想獲取當前日歷表示的日期中的某個時間單位
* 可以使用get方法
*/
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
//month要處理,+1要加上括號陨献,否則變成字符串拼接了
System.out.println(year+"年"+(month+1)+"月"+day+"日");
}
}
SimpleDateFormat類
- 該類的作用是可以很方便的在字符串和日期類之間相互裝行盒犹。
- 我們可以將一個描述日期的字符串:2012-01-01轉(zhuǎn)換為一個Date對象。
- 同樣眨业,我們可以將一個描述日期的Date對象轉(zhuǎn)換為2012-01-01這樣格式的字符串來表示
常用格式字符串
字符 | 含義 | 實例 |
---|---|---|
y | 年 | yyyy年——2013年急膀;yy——13年 |
M | 月 | MM月——01月;M月——1月 |
d | 日 | dd日——06日坛猪;d日——6日 |
E | 星期 | E——星期日(Sun) |
a | AM或PM標識 | a——下午(PM) |
H | 小時(24小時制) | 見下面實例 |
h | 小時(12小時制) | a h時——下午12時 |
m | 分鐘 | HH:mm:ss——12:46:33 |
s | 秒 | hh(a):mm:ss——12(下午):45:46 |
w | 年中的周數(shù) | 27 |
W | 月份中的周數(shù) | 2 |
D | 年中的天數(shù) | 189 |
F | 月份中的星期 | 2 |
k | 一天中的小時數(shù)(1-24) | 24 |
K | am/pm 中的小時數(shù)(0-11) | 0 |
S | 毫秒數(shù) | 978 |
z | 時區(qū)[General time zone] | Pacific Standard Time; PST; GMT-08:00 |
Z | 時區(qū)[RFC 822 time zone] | -0800 |
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期轉(zhuǎn)換類SimpleDateFormat
* 這里我們字符串與日期類間相互轉(zhuǎn)換是需要一些約束的
* “2018-02-28”這個字符串如何轉(zhuǎn)換為Date對象脖阵?
* SimpleDateFormat用來描述日期的格式
* yyyy-MM-dd 2018-02-28
* yy-MM-dd 18-02-28
* yyyy-MM-dd hh:mm:ss 2018-02-28 09:20:53
* yyyy年MM月dd日 hh時mm分ss秒 2018年02月28日 09時20分53秒
*/
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
/**
* 創(chuàng)建一個SimpleDateFormat并告知它要讀取的字符串的格式
*/
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//創(chuàng)建一個日期格式的字符串
String dateFormat = "2018-02-28";
Date date = sdf.parse(dateFormat);//這里有個格式不匹配異常需要拋出或捕獲
System.out.println(date);//Wed Feb 28 00:00:00 CST 2018
/*
* 反向操作,我們也可以將一個Date對象轉(zhuǎn)換為它所描述的日期
* 的字符串墅茉。同樣命黔,轉(zhuǎn)換出來的字符串格式是
* SimpleDateFormat創(chuàng)建的時候設(shè)置的格式
*/
Date now = new Date();//創(chuàng)建用于描述當前系統(tǒng)時間的Date
String nowStr = sdf.format(now);
System.out.println(nowStr);//2018-02-28
sdf=new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
nowStr = sdf.format(now);
System.out.println(nowStr);//2018年02月28日 10時47分11秒
sdf=new SimpleDateFormat("yyyy/MM/dd a hh/mm/ss E");
nowStr = sdf.format(now);
System.out.println(nowStr);//2018/02/28 上午 10/47/11 星期三
/**
* 擴展
*/
SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ss");//非pattern字符“T”要用‘’引入進來
try {
Date date = sdf.parse("2018-11-19T09:21:43:58+00"); //解析的字符串只要前面符合解析匹配規(guī)則,后面不匹配也可以解析
System.out.println(date);//Mon Nov 19 09:21:43 CST 2018
sdf.applyPattern("yyyy.MM.dd G 'at' HH:mm:ss '' z");//非pattern字符“'”只需'引入
//時區(qū)
date = sdf.parse("2001.07.04 AD at 12:08:56 ' PDT");
System.out.println(date);//Thu Jul 05 03:08:56 CST 2001
sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
date = sdf.parse("2001-07-04T12:08:56.235-0700");
System.out.println(date);//Thu Jul 05 03:08:56 CST 2001
} catch (ParseException e) {
e.printStackTrace();
}
Locale aDefault = Locale.getDefault();//當前系統(tǒng)所在地區(qū)
System.out.println(aDefault.getCountry());//CN
System.out.println(aDefault.getDisplayCountry());//中國
System.out.println(aDefault.getLanguage());//zh
System.out.println(aDefault.getDisplayLanguage());//中文
System.out.println(aDefault.getDisplayName());//中文 (中國)
TimeZone timeZone = TimeZone.getDefault();//當前系統(tǒng)所在時區(qū)
System.out.println(timeZone.getDisplayName());//中國標準時間
System.out.println(timeZone.getID());//Asia/Shanghai
TimeZone mTimeZone = TimeZone.getTimeZone("America/Phoenix");
System.out.println(mTimeZone.getDisplayName());//Mountain 標準時間
mTimeZone = TimeZone.getTimeZone("Asia/Shanghai");
System.out.println(mTimeZone.getDisplayName());//中國標準時間
mTimeZone = TimeZone.getTimeZone("GMT+8:00");//東八區(qū)時區(qū)就斤、GMT-8:00(西八區(qū))
System.out.println(mTimeZone.getDisplayName());//GMT+08:00
}
}
工具類
public class DateUtil {
/**
* 按指定格式輸出當前時間
*
* @param pattern
* @return
*/
public static String getCurrentFormatDate(String pattern) {
Date date = new Date();
SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
sdf.applyPattern(pattern);
return sdf.format(date);
}
/**
* 按指定格式輸出時間戳時間
*
* @param timestamp
* @param pattern
* @return
*/
public static String getTimeMillisFormatDate(long timestamp, String pattern) {
Date date = new Date(timestamp);
SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
sdf.applyPattern(pattern);
return sdf.format(date);
}
/**
* 時區(qū)轉(zhuǎn)換
* @param date 要轉(zhuǎn)換的時間
* @param oldPattern 待轉(zhuǎn)換時間的格式
* @param oldLocale 待轉(zhuǎn)換時間所在地區(qū)
* @param newPattern 轉(zhuǎn)換后時間格式
* @param newTimeZone 需轉(zhuǎn)換的地方時區(qū)
* @return
* @throws ParseException
*/
public static String zoneTimeTransform(String date, String oldPattern, Locale oldLocale, String newPattern, TimeZone newTimeZone) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(oldPattern, oldLocale);
Date oldDate = sdf.parse(date);
sdf.applyPattern(newPattern);
sdf.setTimeZone(newTimeZone);
return sdf.format(oldDate);
}
}