2013-07-29 77 views
10

Tôi đôi khi bị lẫn lộn bởi các loại Ngày khác nhau trong java và cách sử dụng thực tế của chúng. Dưới đây tôi đang cố gắng để tóm tắt sự hiểu biết của tôiNgày so với TimeStamp so với lịch?

java.sql.Date :- Một wrapper mỏng xung quanh một giá trị mili giây cho phép JDBC để xác định đây là một giá trị SQL NGÀY

java.sql.Timestamp :- Một wrapper mỏng xung quanh java.util.Date cho phép JDBC API để xác định đây là giá trị SQL TIMESTAMP. Nó cho biết thêm khả năng giữ giá trị giây phân đoạn SQL TIMESTAMP, bằng cách cho phép các đặc điểm kỹ thuật của phân số giây đến độ chính xác của nano giây

Tôi đã thấy hầu hết các dự án thích Dấu thời gian thay vì ngày tháng. Tôi nghĩ rằng lý do chính cho điều này là dấu thời gian có thể giữ giá trị cho đến khi nano giây chính xác trong khi dữ liệu có thể giữ cho đến vài milli giây. Chính xác?

Calendar :- Lớp này được thiết kế dành cho ngày thao tác ví dụ: - để chuyển đổi giữa một khoảnh khắc đặc biệt trong thời gian và một bộ lĩnh vực lịch như NĂM, THÁNG, DAY_OF_MONTH, HOUR, và như vậy, và cho các thao tác lịch các lĩnh vực, chẳng hạn như nhận được ngày của tuần tiếp theo. Thật là tôi không biết tại sao lớp này là trừu tượng khi chỉ có một thực hiện tồn tại tức là GregorianCalendar.

Trả lời

13

java.sql.Timestamp Trình bao bọc mỏng quanh java.util.Date cho phép API JDBC xác định đây là giá trị SQL TIMESTAMP.

Nếu bạn kiểm tra java.sql.Timestamp JavaDoc, nó là rất rõ ràng rằng lớp này kéo dài từ java.util.Date (như java.sql.Date không). Và trong các dự án thế giới thực, bạn phải đồng bằng java.util.Date khi lưu trữ dữ liệu trong cơ sở dữ liệu của bạn và chủ yếu là java.sql.Timestamp vì nó lưu trữ giá trị ngày và giờ, trong khi java.sql.Date chỉ lưu trữ giá trị ngày.

Mặt khác, java.util.Calendar là trừu tượng vì có nhiều triển khai thực hiện điều này ngoài việc java.util.GregorianCalendar. Nếu bạn thấy mã số Calendar#getInstance từ HotSpot, bạn sẽ thấy rằng mã đó gọi là createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)) và mã phương thức này sử dụng 3 lịch khác nhau: BuddhistCalendar, JapaneseImperialCalendarGregorianCalendar. Mã này được sao chép từ JDK 7 nguồn:

private static Calendar createCalendar(TimeZone zone, 
             Locale aLocale) { 
    Calendar cal = null; 

    String caltype = aLocale.getUnicodeLocaleType("ca"); 
    if (caltype == null) { 
     // Calendar type is not specified. 
     // If the specified locale is a Thai locale, 
     // returns a BuddhistCalendar instance. 
     if ("th".equals(aLocale.getLanguage()) 
       && ("TH".equals(aLocale.getCountry()))) { 
      cal = new BuddhistCalendar(zone, aLocale); 
     } else { 
      cal = new GregorianCalendar(zone, aLocale); 
     } 
    } else if (caltype.equals("japanese")) { 
     cal = new JapaneseImperialCalendar(zone, aLocale); 
    } else if (caltype.equals("buddhist")) { 
     cal = new BuddhistCalendar(zone, aLocale); 
    } else { 
     // Unsupported calendar type. 
     // Use Gregorian calendar as a fallback. 
     cal = new GregorianCalendar(zone, aLocale); 
    } 

    return cal; 
} 

Bây giờ, tại sao làm việc trực tiếp với Calendar thay vì GregorianCalendar? Bởi vì bạn phải làm việc với các lớp trừu tượng và các giao diện khi được cung cấp thay vì làm việc trực tiếp với các triển khai thực hiện. Điều này được giải thích tốt hơn ở đây: What does it mean to "program to an interface"?

Ngoài ra, nếu bạn làm việc với ngày và giờ, tôi khuyên bạn nên sử dụng một thư viện như Joda-Time đã xử lý và giải quyết rất nhiều vấn đề với Java Date API hiện tại. để lấy ngày và thời gian này đối tượng trong hương vị java.util.Date.

1

Dòng đầu tiên trong câu hỏi ban đầu chứa cụm từ "các loại gia khác nhau trong java và sử dụng thực tế của họ"

Việc sử dụng thực tế của các kiểu dữ liệu timestamp là chính xác như nó nói - một dấu thời gian được sử dụng bởi SQL để ghi lại một giá trị thời gian chính xác thường được sử dụng cho thứ tự giao dịch. Dấu thời gian thường chỉ được sử dụng trong nội bộ ...trong đó nano giây đếm. Có các trường hợp sử dụng cho dữ liệu dấu thời gian bên ngoài, nhưng chúng tương đối hiếm.

Loại ngày xử lý 99% dữ liệu không cần thiết bên ngoài cần có độ chính xác đến mili giây.

+0

Khi bạn nói "Loại ngày" tôi thu thập, bạn có nghĩa là 'java.util.Date' (mà không phải là những gì được hỏi về, nhưng vẫn có liên quan). Phù hợp với [câu trả lời của Basil Bourque] (https://stackoverflow.com/a/32975887/5772882) Thay vào đó, tôi sử dụng 'java.time.Instant'. –

4

Trước tiên, bạn phải hiểu rằng các lớp ngày giờ cũ đi kèm với các phiên bản Java ban đầu là một mớ hỗn độn khó hiểu của các lớp được thiết kế tồi tệ với hacks. Họ là nỗ lực đầu tiên của ngành công nghiệp tại một cơ sở phức tạp để xử lý ngày giờ, và xứng đáng được tín dụng cho điều đó. Nhưng cuối cùng họ thất bại.

Chúng đã được thay thế bằng khung công tác java.time mới được tích hợp vào Java 8 trở lên.

  • java.sql.Date - Sử dụng java.time.LocalDate thay
  • java.sql.Timestamp - Sử dụng java.time.Instant thay
  • java.util.Calendar & GregorianCalendar - Sử dụng java.time.ZonedDateTime thay

Đối với ngày mà thôi, không có thời gian-of-ngày cũng không múi giờ, sử dụng LocalDate. Trong giây lát trên dòng thời gian ở UTC, hãy sử dụng Instant. Để chỉ định múi giờ khác cho Instant, hãy sử dụng ZonedDateTime.

Đối với công việc cơ sở dữ liệu, cuối cùng chúng ta sẽ thấy các trình điều khiển JDBC được cập nhật trực tiếp sử dụng các loại java.time mới này. Trong khi chờ đợi, hãy tìm các phương thức chuyển đổi thuận tiện được tìm thấy trên cả lớp mới và cũ. Sử dụng java.sql.Date cho một giá trị chỉ ngày tháng. Sử dụng java.sql.Timestamp cho một giá trị ngày-thời gian.

Tôi sẽ không bao gồm mã ở đây vì đã được thực hiện trên nhiều Câu hỏi trùng lặp khác. Vui lòng tìm kiếm StackOverflow.

Các vấn đề liên quan