一、Java Date和LocalDateTime的概念
Java中的Date類是用於表示日期和時間的類。它封裝了從1970年1月1日0時0分0秒(GMT)起經過的毫秒數。而LocalDateTime類是Java 8新引入的日期時間API中的一個類,它表示一個不可變的日期時間對象。它與Date類最大的不同是,它沒有時區信息,因此也沒有對應的偏移量。
需要注意的是,Java 中的Date類已經在Java 8之後變為了過時標註(deprecated),建議使用Java 8中提供的日期時間API替代。但是,由於歷史原因,Date類仍然會在許多現有代碼中使用,因此轉換為LocalDateTime的需求也伴隨着它。
二、Java Date轉LocalDateTime的方法
1. Date實例直接轉LocalDateTime
Java 8的日期時間API中提供了許多方法來完成Date類到LocalDateTime類的轉換。使用DateTimeFormatter格式化Date的日期時間格式並調用LocalDateTime的parse方法,即可完成轉換。
import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; public class DateToLocalDateTime { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //將Date格式化為字符串,因為LocalDateTime的parse方法需要字符串作為參數 String dateString = sdf.format(new Date()); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //調用LocalDateTime的parse方法,將字符串轉為LocalDateTime實例 LocalDateTime ldt = LocalDateTime.parse(dateString, dtf); System.out.println("Date轉LocalDateTime:" + ldt); } catch (Exception e) { e.printStackTrace(); } } }
2. Calendar實例轉LocalDateTime
同樣是使用DateTimeFormatter格式化Calendar的日期時間格式,再調用LocalDateTime的parse方法,就可以將Calendar實例轉為LocalDateTime實例。
import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; public class CalendarToLocalDateTime { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); try { //將Calendar格式化為字符串,因為LocalDateTime的parse方法需要字符串作為參數 String dateString = sdf.format(cal.getTime()); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //調用LocalDateTime的parse方法,將字符串轉為LocalDateTime實例 LocalDateTime ldt = LocalDateTime.parse(dateString, dtf); System.out.println("Calendar轉LocalDateTime:" + ldt); } catch (Exception e) { e.printStackTrace(); } } }
3. Date實例使用Instant中間轉換為LocalDateTime
使用Instant的ofEpochMilli方法將日期轉為Instant實例,再使用atZone方法將它轉為ZoneId實例。最後,使用LocalDateTime的ofInstant方法將Instant轉為LocalDateTime,即可完成Date到LocalDateTime的轉換。
import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; public class DateToLocalDateTimeWithInstant { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //將Date轉為毫秒數,作為Instant的參數 Instant instant = Instant.ofEpochMilli(new Date().getTime()); //使用系統默認時區,將Instant轉為ZoneId ZoneId zoneId = ZoneId.systemDefault(); //使用LocalDateTime的ofInstant方法,將Instant轉為LocalDateTime LocalDateTime ldt = LocalDateTime.ofInstant(instant, zoneId); System.out.println("Date使用Instant轉LocalDateTime:" + ldt); } catch (Exception e) { e.printStackTrace(); } } }
4. Calendar實例使用Instant中間轉換為LocalDateTime
同樣適用於Calendar實例。唯一的區別在於要使用Calendar的getTimeInMillis方法來將Calendar轉為毫秒數,作為Instant的參數。
import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Calendar; public class CalendarToLocalDateTimeWithInstant { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Calendar cal = Calendar.getInstance(); //將Calendar轉為毫秒數,作為Instant的參數 Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis()); //使用系統默認時區,將Instant轉為ZoneId ZoneId zoneId = ZoneId.systemDefault(); //使用LocalDateTime的ofInstant方法,將Instant轉為LocalDateTime LocalDateTime ldt = LocalDateTime.ofInstant(instant, zoneId); System.out.println("Calendar使用Instant轉LocalDateTime:" + ldt); } catch (Exception e) { e.printStackTrace(); } } }
三、總結
Java日期和時間的處理歷來是一個比較複雜的問題,在Java 8之前,Date類是用來處理時間的,它存在日期和時間混合在一起的問題和時區轉換的問題。Java 8引入了新的日期時間API,這個API使日期和時間的處理變得更加簡單。通過上述代碼演示的四種方法,可以把Java Date或Calendar對象轉換為LocalDateTime對象,同時保證時區正確。
在實際應用中,開發者需要根據項目的實際情況選擇最合適的方法進行轉換,同時需要特別注意Java 8中日期時間API的格式化和解析方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/307026.html