2015-04-28 25 views
7

Tôi đang cố gắng chuyển đổi Date thành LocalTime (Tôi chỉ muốn giờ và phút của ngày) nhưng không hoạt động. đầu tiên tôi nhìn đây date-to-java-time và cố gắng chuyển đổi một Date để LocalTime nhưng điều đó không làm việc vì vậy tôi đã cố gắng để chuyển đổi Date để Calendar và sau đó chuyển đổi Calendar để Date nhưng điều đó cũng không làm việc.Làm thế nào để chuyển đổi ngày thành LocalTime?

Tôi nghĩ rằng đó là vì date lưu trữ thời gian trong fasttime thay vì cdate. Nhưng đó chỉ là cảm giác ruột. Dưới đây là mã của tôi:

//create the date 
String strTime ="2011-02-18 05:00:00.0"; 
Date date = format.parse(strTime);  

//convert to calendar 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 

//convert the date to a local time 
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis()); 
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime(); 

tôi không nhận được một lỗi biên dịch nhưng LocalTime giờ mình không được thiết lập và giữ 0.

+0

Trước tiên, chúng ta đang nói về phiên bản Java nào? –

+0

@ RafaelR.S.Robles JDK 1.8 – Stanko

Trả lời

9

Thông tin nhập của bạn có hiệu quả là LocalDateTime. Sẽ đơn giản hơn nhiều khi chỉ phân tích cú pháp đó thành số LocalDateTime và sau đó nhận được LocalTime từ đó. Không múi giờ phải lo lắng về, không có lớp hơi-legacy (tránh DateCalendar nếu có thể ...)

import java.time.*; 
import java.time.format.*; 
import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     DateTimeFormatter formatter = 
      DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US); 

     String text = "2011-02-18 05:00:00.0"; 
     LocalDateTime localDateTime = LocalDateTime.parse(text, formatter); 
     LocalTime localTime = localDateTime.toLocalTime(); 
     System.out.println(localTime); 
    } 
} 
0

Hãy thử điều này

String datestring = "2011-02-18 05:00:00.0"; 
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//take a look at MM 
    Date date = dt.parse(datestring); 
    Instant instant = Instant.ofEpochMilli(date.getTime()); 
    LocalTime res = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime(); 
+0

Ngớ ngẩn để kết hợp các lớp học cũ phiền hà với các lớp java.time. Các lớp cũ được thay thế bởi các lớp java.time. Không cần những cái cũ. –

7

này cũng khá đơn giản: LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()

2

accepted Answer by Jon Skeet là chính xác. Câu trả lời này mở rộng trên những ý tưởng đó.

Tránh thừa lớp ngày thời gian

Một số các câu trả lời khác, và câu hỏi, trộn các lớp học di sản ngày thời gian cũ với cái mới. Đó là thực hành không cần thiết và không tốt. Toàn bộ các điểm của các lớp học java.time là để thay thế các lớp học cũ khó hiểu và khó hiểu.

  • Bạn làm không cần java.util.Date.
  • Bạn làm không cần java.util.Calendar.

LocalDateTime

chuỗi đầu vào của bạn thiếu bất kỳ thông tin về bù đắp-từ-UTC hoặc múi giờ. Vì vậy, chúng tôi phân tích cú pháp đó thành đối tượng LocalDateTime.

Để phân tích cú pháp, chúng tôi thay thế không gian ở giữa bằng T để tuân thủ tiêu chuẩn ISO 8601 cho các định dạng ngày giờ.

String input = "2011-02-18 05:00:00.0".replace(" " , "T"); 
LocalDateTime ldt = LocalDateTime.parse(input); 

LocalTime

Để tập trung vào thời gian của ngày mà không có ngày, yêu cầu một LocalTime.

LocalTime lt = ldt.toLocalTime(); 

ZonedDateTime

Lưu ý rằng không ai trong số này là những khoảnh khắc thực tế, không phải là một điểm trên timeline. Nếu không có bối cảnh chênh lệch từ UTC hoặc múi giờ, chúng tôi không biết liệu bạn có ý định 5 giờ sáng ở Auckland NZ hay 5 giờ sáng tại Kolkata IN hoặc 5 giờ sáng tại Paris Pháp hoặc 5 giờ sáng tại Montréal Québec. Mỗi người trong số đó sẽ là những khoảnh khắc rất khác nhau trong thời gian.

Nếu theo ngữ cảnh bạn biết chắc chắn múi giờ dự định, hãy áp dụng nó. Áp dụng ZoneId để nhận được ZonedDateTime.

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ldt.atZone(z); 

Từ đó, yêu cầu LocalTime nếu muốn.

LocalTime lt = zdt.toLocalTime(); 

Instant

Nếu bạn muốn để thấy rằng cùng một thời điểm trong UTC, trích xuất một Instant. Lớp Instant đại diện cho một thời điểm trên dòng thời gian trong UTC với độ phân giải nanoseconds (tối đa chín (9) chữ số của một phần thập phân).

Nói chung, tốt nhất là tập trung vào một số lôgic kinh doanh, ghi nhật ký, lưu trữ dữ liệu và trao đổi dữ liệu của bạn. Tìm hiểu suy nghĩ của UTC là "The One True Time".

Instant instant = zdt.toInstant(); // Same moment, shifted to UTC. 
Các vấn đề liên quan