2010-10-25 17 views
13

Tôi cần một phương pháp để chuyển đổi đối tượng GregorianCalendar sang Thời gian Unix (tức là một thời gian dài). Cũng cần một phương pháp để chuyển đổi thời gian Unix (dài) trở lại đối tượng GregorianCalendar. Có phương pháp nào ngoài đó thực hiện điều này không? Nếu không, thì làm thế nào tôi có thể làm điều đó? Bất cứ sự giúp đỡ nào cũng được đánh giá cao.Làm cách nào để chuyển đổi từ Lịch Gregorian sang Thời gian Unix, trong Java?

Liên kết đến GregorianCalendar Class ->http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

Cảm ơn.

Trả lời

26

Phương thức getTimeInMillis()setTimeInMillis(long) sẽ cho phép bạn nhận và đặt thời gian bằng mili giây, là thời gian unix nhân với 1000. Bạn sẽ phải điều chỉnh thủ công vì thời gian unix không bao gồm mili giây - chỉ giây.

 
long unixTime = gregCal.getTimeInMillis()/1000; 
gregCal.setTimeInMillis(unixTime * 1000); 

Ngoài: Nếu bạn sử dụng ngày một nhiều trong ứng dụng của bạn, đặc biệt nếu bạn đang chuyển đổi ngày hoặc sử dụng nhiều múi giờ, tôi sẽ khuyên bạn nên sử dụng thư viện JodaTime. Nó rất hoàn chỉnh và khá tự nhiên hơn một chút so với hệ thống Lịch đi kèm với Java.

+0

+1 cho thời gian joda –

+0

Xin cảm ơn. Tôi chỉ cần mã bạn viết. Cảm ơn rất nhiều! – androidNoob

+0

Kể từ khi nào thời gian unix không có mili giây? – Pacerier

0

Calendar.getTimeInMillis() nên được những gì bạn đang tìm kiếm.

0

tl; dr

myGregCal.toZonedDateTime().toEpochSecond()      // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`. 

Và đi theo một hướng khác ...

GregorianCalendar.from(          // Convert from modern `ZonedDateTime` to troublesome legacy class `GregorianCalendar`. 
    Instant.ofEpochSecond(yourCountOfWholeSecondsSinceEpoch) // Moment in UTC. 
     .atZone(            // Apply `ZoneId` to `Instant` to produce a `ZonedDateTime` object. 
      ZoneId.of("Africa/Tunis") 
     ) 
)                

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

Các câu trả lời khác là chính xác và ngắn. Nhưng, FYI, các lớp học ngày thời gian cũ phiền hà như java.util.Date, java.util.Calendar, và java.text.SimpleDateFormat hiện nay legacy, thay thế bởi sự java.time class built vào Java 8 & Java 9.

Vì vậy, đây là làm thế nào để chuyển đổi và sử dụng hiện đại thay vào đó là các lớp học cho vấn đề của bạn.

java.time

Chuyển đổi từ lớp di sản GregorianCalendar đến lớp hiện đại ZonedDateTime. Gọi các phương thức mới được thêm vào các lớp cũ.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ; 

Và đi theo một hướng khác ...

GregorianCalendar myGregCal = GregorianCalendar.from(zdt) ; 

Nếu bởi “Unix time” bạn có nghĩa là một số của toàn bộ giây kể từ khi epoch reference của giây phút đầu tiên của năm 1970 tại UTC, 1970-01-01T00: 00: 00Z , sau đó gọi toEpochSecond.

long secondsSinceEpoch = zdt.toEpochSecond() ; 

Nếu bạn có nghĩa là đếm mili giây từ năm 1970 bắt đầu bằng UTC, sau đó trích xuấ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).

Instant instant = zdt.toInstant() ; 

Bây giờ ask for the count of milliseconds.

long millisecondsSinceEpoch = instant.toEpochMill() ; 

Hãy nhớ rằng toàn bộ giây hoặc milliseconds có thể liên quan đến mất dữ liệu. Các số ZonedDateTimeInstant đều giải quyết thành nano giây. Vì vậy, bất kỳ microseconds hoặc nano giây nào có thể có mặt sẽ bị bỏ qua khi bạn đếm toàn bộ giây hoặc mili giây.


Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Sử dụng JDBC driver tương thích với JDBC 4.2 hoặc cao hơn, bạn có thể trao đổi java.time đối tượng trực tiếp với cơ sở dữ liệu của bạn. Không cần chuỗi và các lớp java.sql. *.

Nơi lấy các lớp java.time?

  • Java SE 8, Java SE 9, và sau đó
    • Built-in.
    • Một phần của API Java chuẩn với gói được triển khai.
    • Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
  • Java SE 6Java SE 7
    • Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
  • Android
    • phiên bản sau của triển khai bó Android của các lớp java.time.
    • Đối với Android trước đó, dự án ThreeTenABP thích hợp ThreeTen-Backport (đã đề cập ở trên). Xem How to use ThreeTenABP….

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.