本篇博客主要總結Java里面關於獲取當前時間的一些方法
System.currentTimeMillis()
獲取標准時間可以通過System.currentTimeMillis()方法獲取,此方法不受時區影響,得到的結果是時間戳格式的。例如:
1543105352845
我們可以將時間戳轉化成我們易於理解的格式
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date));
則該時間戳對應的時間為:
2018-11-25 at 01:22:12 CET
值得注意的是,此方法會根據我們的系統時間返回當前值,因為世界各地的時區是不一樣的。
java.util.Date
在Java中,獲取當前日期最簡單的方法之一就是直接實例化位於Java包java.util的Date類。
Date date = new Date(); // this object contains the current date value
上面獲取到的日期也可以被format成我們需要的格式,例如:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss:SSS");
System.out.println(formatter.format(date));
Calendar API
Calendar類,專門用於轉換特定時刻和日歷字段之間的日期和時間。
使用Calendar 獲取當前日期和時間非常簡單:
Calendar calendar = Calendar.getInstance(); // get current instance of the calendar
與date一樣,我們也可以非常輕松地format這個日期成我們需要的格式
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(calendar.getTime()));
上面代碼打印的結果如下:
25-11-2018 00:43:39
Date/Time API
Java 8提供了一個全新的API,用以替換java.util.Date和java.util.Calendar。Date / Time API提供了多個類,幫助我們來完成工作,包括:
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
LocalDate
LocalDate只是一個日期,沒有時間。 這意味着我們只能獲得當前日期,但沒有一天的具體時間。
LocalDate date = LocalDate.now(); // get the current date
我們可以format它
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println(date.format(formatter));
得到的結果只有年月日,例如:
25-11-2018
LocalTime
LocalTime與LocalDate相反,它只代表一個時間,沒有日期。 這意味着我們只能獲得當天的當前時間,而不是實際日期:
LocalTime time = LocalTime.now(); // get the current time
可以按如下方式format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter));
得到的結果類似如下:
00:55:58
LocalDateTime
最后一個是LocalDateTime,也是Java中最常用的Date / Time類,代表前兩個類的組合 - 即日期和時間的值:
LocalDateTime dateTime = LocalDateTime.now(); // get the current date and time
format的方式也一樣
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));
得到的日期結果類似於:
25-11-2018 00:57:20
比較兩個日期
SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd");
Date date1 = dateFormat.parse("2019-09-16");
Date date2 = dateFormat.parse("2020-01-25");
if(date1.before(date2)){
System.out.println("Date1 時間在 Date2 之前");
}
if(date1.after(date2)){
System.out.println("Date1 時間在 Date2 之后");
}
if(equals.equals(date2)){
System.out.println("Date1 時間與 Date2 相等");
}
# compareTo():等於,返回 0,大於參數日期,返回正值,小於參數日期,返回負數
if(equals.compareTo(date2)){
System.out.println("Date-1 is compareTo Date-2");
}
——————————————————————————————————————-------------------------------------
# 使用java.util.Calendar比較兩個Date日期
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
if(cal1.after(cal2)) {
System.out.println("Date1 時間在 Date2 之后");
}
if(cal1.before(cal2)) {
System.out.println("Date1 時間在 Date2 之前");
}
if(cal1.equals(cal2)) {
System.out.println("Date1 時間與 Date2 相等");
}
--------------------------------------------------------------------------
# Java 8日期比較
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date1 = LocalDate.of(2009, 12, 31);
LocalDate date2 = LocalDate.of(2019, 1, 31);
if(date1.isAfter(date2)) {
System.out.println("Date1 時間在 Date2 之后");
}
if(date1.isBefore(date2)) {
System.out.println("Date1 時間在 Date2 之前");
}
if(date1.isEqual(date2)) {
System.out.println("Date1 時間與 Date2 相等");
}
時間戳與Date相互轉換
// 一、時間戳與Date相互轉換
// 時間戳轉Date
public static void timestamp2Date() {
long timeMillis = System.currentTimeMillis();
Date date = new Date(timeMillis);
}
// Date轉時間戳
public static void date2Timestamp() {
Date date = new Date();
long timeMillis = date.getTime();
}
// 二、時間戳與LocalDateTime相互轉換
// 時間戳轉LocalDateTime
public static void timestamp2LocalDateTime() {
long timeMillis = System.currentTimeMillis();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = Instant.ofEpochMilli(timeMillis).atZone(zoneId).toLocalDateTime();
}
// LocalDateTime轉時間戳
public static void localDateTime2Timestamp() {
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime now = LocalDateTime.now();
long epochMilli = now.atZone(zoneId).toInstant().toEpochMilli();
}
LocalDateTime常見用法
// 1、獲取當前日期
年月日時分秒:LocalDateTime now=LocalDateTime.now();
年月日:LocalDate today = LocalDate.now();
時分秒:LocalTime time= LocalTime.now();
// 2、獲取某一個日期
根據字符串獲取: LocalDate date= LocalDate.parse(“2020-01-10”);
取本月第1天:LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2020-01-01
取本月第2天:LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2020-01-02
取本月最后一天:LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2019-12-31
取2020年1月第一個周一:LocalDate firstMonday = LocalDate.parse(“2020-01-01”).with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2020-01-06
// 日期加減
LocalDateTime nextnow= now.plusDays(1); //返回LocalDateTime加上指定天數得到的值
now.plusHours(3); //返回LocalDateTime加上指定小時數得到的值
now.plusMinutes(10); //返回LocalDateTime加上指定分鍾數得到的值
now.plusMonths(2); //返回LocalDateTime加上指定月數得到的值
now.plusWeeks(1); //返回LocalDateTime加上指定星期數得到的值
now.plusYears(3); //返回LocalDateTime加上指定年數得到的值
now.minusHours(2); //返回LocalDateTime減去指定小時數得到的值
now.minusHours(2); //返回LocalDateTime減去指定小時數得到的值
now.minusMinutes(2); //返回LocalDateTime減去指定分鍾數得到的值
now.minusMonths(2); //返回LocalDateTime減去指定月數得到的值
now.minusNanos(2); //返回LocalDateTime減去指定納秒數得到的值
now.minusSeconds(2); //返回LocalDateTime減去指定秒數得到的值
now.minusWeeks(2); //返回LocalDateTime減去指定星期數得到的值
now.minusYears(2); //返回LocalDateTime減去指定年數得到的值
// 4、2個日期的計算
//相差的小時數:
Duration duration = Duration.between(createAt, now);
long hours = duration.toHours();
//相差的分鍾數:
long minutes=duration.toMinutes();