java處理日期和時間


java處理日期和時間

1. jdk API

java.util

  • Date
  • Calendar

java.time(jdk>=1.8)

  • LocalDate
  • LocalTime
  • ZonedDateTime
  • Instant

新API的特點:

  • 嚴格區分日期,時間
  • 不變類(類似於String)
  • Month范圍1-12(Jan-Dec)
  • Week范圍1-7(Mon-Sun)

2. Date

注意: import java.util而不是importjava.sql

2.1Date對象的主要方法

  • toString() 把Date對象變成字符串
  • getTime()把Date對象轉換成時間戳
Date now = new Date();
System.out.println(now);
System.out.println(now.toString());// 把now轉換成字符形式
System.out.println(now.getTime());// 通過now獲取時間戳

結果:

Wed Jun 05 14:03:26 CST 2019
Wed Jun 05 14:03:26 CST 2019
1559714606831

java.util.Date的問題:

  • 不能轉換時區
  • 日期和時間的加減
  • 兩個日期相差多少天
  • 計算某個月第一個星期一

2.2 SimpleDateFormat

yyyy: 年

MM: 月

dd: 日

HH: 時

mm: 分

ss: 秒

Date now = new Date();
// 把Date按照格式轉換成字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(now));

// 把字符串按照格式轉換成Date對象
String s1 = "2016-11-20 12:15:35";
Date date1 = sdf.parse(s1);
System.out.println(date1);

3. Calendar(日歷)

導入: import java.util.Calendar

 // 創建實例
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH);// 得到的月份比實際月份小1
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
Date date = c.getTime();
// 獲得時間戳
long ms1 = c.getTimeInMillis();
  • Date c.getTime() 獲得Date對象
  • long getTimelnMillis() 獲得毫秒數
  • get(int field) 獲得年月日, 時分秒
  • setTime(Date) 設定時間
  • setTimeInMillis(long) 根據時間戳設置時間
  • set(int field, int value) 根據年月日等設定時間
  • setTimeZone(TimeZone) 更改時區

c.setTimeZone(TimeZone.getTimeZone("America/New_York"))

  • add(int field, int value)
// +5 day
c.add(Calendar.DAY_OF_MONTH, 5);
// -2 hours
c.add(Calendar.HOUR_OF_DAY, -2);

4. LocalDateTime

4.1 獲取當前日期和時間

  • LocalDate
  • LocalTime
  • LocalDateTime
// 當前日期
LocalDate ld = LocalDate.now();
// 當前時間
LocalTime lt = LocalTime.now();
// 當前日期和時間
LocalDateTime ldt = LocalDateTime.now();

// 指定日期和時間
LocalDate ld2 = LocalDate.of(2016, 11, 30);
LocalTime lt2 = LocalTime.of(15, 16, 17);
LocalDateTime ldt2 = LocalDateTime.of(2016, 11, 30, 15, 16, 17);
LocalDateTime ldt3 = LocalDateTime.of(ld2, lt2);

4.2 DateTimeFormatter

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
LocalDateTime dt3 = LocalDateTime.parse("2016-12-30 15:16:17", dtf);
System.out.println(dt3);//2016-12-30T15:16:17

4.3 日期和時間的運算

增加:

  • plusYears(1): +1年
  • plusMonths(1): +1月
  • plusDays(1): +1天
  • plusHours(1): +1小時
  • plusMinutes(1): +1 分鍾
  • plusSeconds(1): +1 秒

減少

  • minusYears(1): +1年
  • minusMonths(1): +1月
  • minusDays(1): +1天
  • minusHours(1): +1小時
  • minusMinutes(1): +1 分鍾
  • minusSeconds(1): +1 秒
LocalDateTime now = LocalDateTime.now();
LocalDateTime d = now.plusDays(1).minusHours(1);

調整年, 月,日, 時, 分, 秒

  • withYear(2018): 調整年
  • withMonth(): 調整月
  • withDayOfMonth(): 調整為本月的第幾天
  • withDayOfYear(): 調整本年的第幾天
  • withHour(): 調整小時
  • withMinute(): 調整分鍾
  • withSecond(): 調整秒

判斷日期和時間的先后:

  • isBefore()
  • isAfter()
  • equals()

計算兩個日期的相差時間:Period

	LocalDate d1 = LocalDate.of(2018, 11, 20);
	LocalDate d2 = LocalDate.of(2050, 1, 2);
	Period p = d1.until(d2);
	System.out.println(p);// P31Y1M13D  
	// 兩個日期相差多少天
	System.out.println(Math.abs(d1.toEpochDay() - d2.toEpochDay()));// 11366
  • p.getYears()
  • p.getMonths()
  • p.getDays()

5. ZonedDateTime

ZonedDateTime = LocalDateTime + ZoneId

  • ZonedDateTime: 帶時區的日期和時間
  • ZoneId: 新時區對象(取代就的java.util.TimeZone)
  • Instant: 時刻對象(內部用long表示epoch seconds)
ZonedDateTime zbj = ZonedDateTime.now();// 當前時區的日期和時間
ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));// 紐約時區的日期和時間
// 北京時區變成紐約時區
ZonedDateTime ny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
// 把LocalDateTime轉換成ZonedDateTime
ZonedDateTime bj = LocalDateTime.now().atZone(ZoneId.systemDefault());

Instant: 對象表示某個時刻

Instant ins1 = Instant.now();
Instant ins2 = ZonedDateTime.now().toInstant();
// 注意是秒
long epoch = ins1.getEpochSecond();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM