目錄
1.1、時間進制
1.2、獲取毫秒級時間戳
1.3、獲取納秒級時間戳
2.1、Data
2.2、Calendar
3.1、LocalDate
3.2、LocalTime
3.3、LocalDateTime
3.4、Clock
3.5、Instant
4、日期時間格式
4.1、簡單示例
4.2、常用格式轉換
5、月份對應的英文
前言
平常會遇到很多的日期格式,各種各樣的,什么UTC、GMT、毫秒級、微秒級、納秒級....這些格式,怎么創建這些格式很簡單,但是,怎么將這幾種格式進行相互轉換,是一個問題!!!!所以我專門寫一篇博客,做一下筆記吧,反正經常會用到。
1、獲取當前時間的時間戳
1.1、時間進制
1秒=1000毫秒
1秒=1000000微秒(1毫秒=1000微秒)
1秒=1000000000納秒(1微秒=1000納秒) ( 1毫秒=1000000納秒)
要獲得秒級時間戳,可以使用毫秒級時間戳除以1000即可。
1.2、獲取毫秒時間戳
獲取毫秒時間戳的方式比較多,一般都是用System.currentTimeMillis()。
@Test
public void testTimeStamp() {
// 獲得當前時間的時間戳(13位),單位是毫秒
// 方式1
long timeStamp1 = System.currentTimeMillis();
// 方式2
Date date = new Date();
long timeStamp2 = date.getTime();
// 方式3
Calendar calendar = Calendar.getInstance();
long timeStamp3 = calendar.getTimeInMillis();
// 方法4
Clock clock = Clock.systemUTC();
long timeStamp4 = clock.millis();
// 打印時間戳示例
String str = String.format("%s %s %s %s", timeStamp1, timeStamp2, timeStamp3, timeStamp4);
System.out.println(str);
// 1567942696718 1567942696718 1567942696728 1567942696731
}
1.3、獲取納秒時間戳
納秒時間戳,好像用的不是特別多
System.out.println(System.nanoTime());
2、java.util包
2.1、Date
之所以使用java.util.Date指明Date類的包為java.util,是因為java.sql包中也有一個Date類。
Date類的輸出格式:Sun Sep 08 17:49:50 CST 2019
Date類有很多方法都被廢棄了,包括構造方法,所以常用的使用方法如下:
@Test
public void testDete() {
// 利用當前時間戳創建的Date實例,底層調用System.currentTimeMillis()
Date date1 = new Date();
System.out.println(date1); // Sun Sep 08 17:49:50 CST 2019
// 利用一個時間戳來創建Date對象(時間戳轉Date對象)
long timeStamp = System.currentTimeMillis() - 100; // 當前時間的100秒前
Date date2 = new Date(timeStamp);
// Date的compareTo,用於比較兩個時間的先后
int flag = date1.compareTo(date2);
// date1.compareTo(date2)返回值分三種情況
// flag = 0, 兩個時間相同(時間戳相同)
// flag = 1, date1 要晚於 date2(date1的時間戳大於date2的時間戳)
// flag = -1,date1 要早於 date2(date1的時間戳小於於date2的時間戳)
// 判斷date1是否晚於date2
boolean after = date1.after(date2);
// 判斷date1是否早於date2
boolean before = date1.before(date2);
// 獲取date對象的時間戳(13位),毫秒
timeStamp = date1.getTime();
// 設置date對象的時間戳
date1.setTime(timeStamp);
}
建議不要使用Date類的廢棄的API,有一個Date.getMonth()獲取月份,是從0開始計數,也就是說,5月份,getMonth()的值是4。
3.2、Calendar
Calendar是一個抽象類,所以不能實例化,但是可以調用getInstance()靜態方法獲得Calendar實例。
@Test
public void testCalender() {
// 調用靜態方法獲取Calendar實例(使用默認的TimeZone和Locale)
Calendar calendar1 = Calendar.getInstance();
// 獲取時間戳(13位),毫秒
long timeStamp = calendar1.getTimeInMillis();
// 獲取Date對象
Date date1 = calendar1.getTime();
// 設置時間
Date date2 = new Date(System.currentTimeMillis() - 100);
calendar1.setTime(date2);
// 獲取Calendar的字段值(比如YEAR、MONTH....)
final int month = calendar1.get(Calendar.MONTH);
System.out.println(month); // 注意,month從0開始計算,9月返回8
// 修改時間(為指定字段進行計算)
calendar1.add(Calendar.YEAR, -1); // 當前是2019年,這里將年份減1
System.out.println(calendar1.get(Calendar.YEAR)); // 2018
// 其他字段,比如月、天、時分秒的計算都是一樣的做法
// 獲取某個字段的最大值(同樣可以有對應的接口獲取最小值)
int maxDay = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(maxDay); // 2018年9月,最多有30天
Calendar calendar2 = Calendar.getInstance();
// 設置指定字段值,注意,月份是從0開始計數
calendar2.set(Calendar.YEAR, 2030);
// 設置年月日
calendar2.set(2029, 11, 5);
System.out.println(calendar2.getTime());
// Wed Dec 05 18:06:30 CST 2029
// 設置年月日時分秒
calendar2.set(2030,10, 4, 12, 58, 59);
}
3、java.time包的類
3.1、LocalDate
LocalDate可以說使用的比較多了,因為可以比較方便的獲取、設置、修改日期,需要注意的是,LocalDate,從名稱上就能看出,這是獲取“本地”日期。
@Test
public void testLocalDate() {
// 創建LocalDate對象
LocalDate localDate = LocalDate.now();
System.out.println(localDate); // 2019-09-08
final LocalDate localDate2 = localDate.minusDays(5);
System.out.println(localDate); // 2019-09-08 注意,並不會直接修改LocalDate對象
System.out.println(localDate2); //2019-09-03
// getXxxx獲取年月日信息
final int dayOfMonth = localDate.getDayOfMonth();
System.out.println(dayOfMonth);
// 設置時間為2019-11-20,月份從1開始
LocalDate localDate3 = LocalDate.of(2019, 11, 20);
System.out.println(localDate3); // 2019-11-20
// 2019年的第100天
LocalDate localDate4 = LocalDate.ofYearDay(2019, 100);
System.out.println(localDate4); // 2019-04-10
// 可以調用LocalData的minusXxx、plusXxx進行日期的計算,getXxx獲取某項值
}
3.2、LocalTime
LocalTime,主要是對Time,也就是對時間的操作,並且是本地的時間
@Test
public void testLocalTime() {
// 利用當前時間,創建LocalTime對象
LocalTime localTime1 = LocalTime.now();
System.out.println(localTime1); // 18:59:31.848
// 指定時-分,創建LocalTime對象,注意,小時范圍為0-23
LocalTime localTime2 = LocalTime.of(23, 59);
System.out.println(localTime2); // 23:59 注意,輸出沒有秒數
// 指定時-分-秒,創建LocalTime對象
LocalTime localTime3 = LocalTime.of(12, 35, 40);
System.out.println(localTime3); // 12:35:40
// 額外指定納秒
LocalTime localTime4 = LocalTime.of(13, 20, 55, 1000);
System.out.println(localTime4);
// 指定一天中的第1000秒來創建LocalTime對象
LocalTime localTime5 = LocalTime.ofSecondOfDay(1000);
System.out.println(localTime5); // 00:16:40
// 利用一天中的納秒數來創建LocalTime對象
LocalTime localTime6 = LocalTime.ofNanoOfDay(100000000);
System.out.println(localTime6); // 00:00:00.100
// 可以調用LocalTime的plusXxx,minusXxx進行時間計算,getXxx獲取某項值
}
3.3、LocalDateTime
聰明的你,一定知道LocalDateTime其實就是LocalDate和LocalTime加在一起的類了,使用方式也是一樣的。
@Test
public void testLocalDateTime() {
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2019-09-08T19:16:03.884
// 利用LocalDate和LocalTime創建LocalDateTime實例
LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(), LocalTime.now());
System.out.println(localDateTime1); // 2019-09-08T19:18:36.934
// of用法和LocalDate和LocalTime的of用法一樣,綜合在一起了而已
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 5, 30, 12, 50, 45);
System.out.println(localDateTime2); // 2019-05-30T12:50:45
// 可以調用LocalDateTime的minusXxx,plusXxx來進行日期和時間的操作,使用getXxx獲取某個項的值
}
3.4、Clock
Clock,時鍾,用法如下:
@Test
public void testClock() {
Clock clock = Clock.systemUTC();
// 獲取時區
final ZoneId zone = clock.getZone();
System.out.println(zone); // Z
// 獲取時間戳(13位),毫秒
long timeStamp = clock.millis();
System.out.println(timeStamp); // 1567942442222
}
3.5、Instant
Instant基本沒用過(對於我而言)
@Test
public void testInstant() {
Instant instant = Instant.now();
System.out.println(instant); // 2019-09-08T11:39:29.194Z
final Instant parse = Instant.parse("2019-09-08T11:39:29.109000000Z");
System.out.println(parse); // 2019-09-08T11:39:29.109Z
// 可以調用plusXxx,minusXxx進行時間計算
}
4、日期時間格式
日期時間格式,可以使用SimpleDateFormat類進行自定義設置;
4.1、簡單示例
@Test
public void testSimpleDateFormat() {
Date date = new Date();
System.out.println(date); // Sun Sep 08 19:49:57 CST 2019
// 創建想要顯示的格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final String dateStr = formatter.format(date);
System.out.println(dateStr); // 2019-09-08 19:49:57
}
4.1、常用格式轉換
格式有很多種,業務不同,時間的格式也是不同的,但是可以掌握一下規律
/**
* 將UTC時間進行轉換
* 比如 2019-09-08T19:49:57Z
* 2019-09-08T19:49:57.100Z
* 2019-09-08T19:49:57.100000000Z
* 2019-09-08T19:49:57.100000000 CST
* 轉換為
* 2019-09-08 19:49:57
*/
@Test
public void parse1() {
// 要解析的時間字符串
String src = "2019-09-08T19:49:57.100000000Z CST";
// 解析日期時,下面這個格式是通用的
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// 目標格式
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = formatter1.parse(src);
String dateStr = formatter2.format(date);
System.out.println(dateStr); // 2019-09-08 19:49:57
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* 生成GMT格式的時間:Thu, 15 Sep 2011 12:13:41 GMT
*/
@Test
public void testToGMT() {
SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
String str = formatter.format(new Date());
System.out.println(str); // Sun, 08 Sep 2019 23:01:35 GMT
}
/**
* 時間計算
*
* @param datatime 字符串形式的日期時間,比如2019-10-09 20:03:00
* @param seconds 增減多少秒
* @return
*/
public String computeDateTime(String datatime, int seconds) {
if (seconds == 0) {
return datatime;
}
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = formatter.parse("2019-10-09 20:03:00");
long resMillSecond = date.getTime() + seconds * 1000;
return formatter.format(new Date(resMillSecond));
} catch (ParseException e) {
e.printStackTrace();
}
return datatime;
}
public void testTime() throws ParseException {
System.out.println(computeDateTime("2018-10-09 20:03:00", 4)); // 2018-10-09 20:02:56
System.out.println(computeDateTime("2018-10-09 20:03:00", -4)); // 2018-10-09 20:03:04
}
5、月份對應的英文
| 月份 | 英文 |
| 1月 | January |
| 2月 | February |
| 3月 | march |
| 4月 | April |
| 5月 | May |
| 6月 | June |
| 7月 | July |
| 8月 | August |
| 9月 | September |
| 10月 | October |
| 11月 | November |
| 12月 | December |
