Từ Joda Time FAQ:
có giây nhuận được hỗ trợ?
Thời gian Joda không hỗ trợ giây nhảy vọt. Các giây nhuận có thể được hỗ trợ bằng cách viết một niên đại chuyên ngành mới, hoặc bằng cách thực hiện một vài cải tiến cho lớp hiện tại ZonedChronology
. Trong cả hai trường hợp, các phiên bản Joda-Time trong tương lai sẽ không cho phép các giây nhảy vọt theo mặc định. Hầu hết các ứng dụng không cần thiết và có thể có thêm chi phí hiệu suất.
Từ IANA/Olson TZDB file on leap seconds:
Mặc dù định nghĩa cũng bao gồm khả năng thả giây ("tiêu cực" giây nhuận), điều này chưa bao giờ được thực hiện và dường như không cần thiết trong tương lai gần.
câu hỏi đầu tiên của bạn:
Làm thế nào để đảm bảo rằng các ts luôn tăng và không lạc hậu?
Một bước nhảy vọt thứ hai tiêu cực sẽ để lại cho bạn tại timestamp cùng (một giá trị cho hai giây trôi qua), do đó bạn có thể không thực sự đi lùi mà ko hai giây nhuận tiêu cực. Vì nó không xuất hiện có khả năng là sẽ có một giây nhảy vọt tiêu cực, tôi muốn nói đây là một vấn đề bạn sẽ không bao giờ thực sự gặp phải.
Cập nhật: Cách duy nhất tôi có thể hình dung dấu thời gian quay trở lại là nếu bạn sử dụng chính xác mili giây và hành vi gặp phải # 3 bên dưới.
câu hỏi thứ hai của bạn:
Làm thế nào để chọn chính xác khoảng 100 từ db mà lấy tài khoản vào những bước nhảy vọt thứ hai?
Vì thời gian ghi của bạn bằng UTC, giá trị của bạn đã bao gồm số giây nhảy vọt. Tôi biết rằng âm thanh có thể phản trực giác, vì khi bạn mô tả chính xác là 86400 giây (86400000 mili giây) trong một ngày theo thang điểm này. Nhưng họ thực sự ở đó. Nếu không - thì chúng tôi sẽ đồng bộ hóa với TAI chứ không phải là UTC. Vì vậy, làm thế nào có thể được? Vâng, có một vài điều khác nhau có thể xảy ra khi một bước nhảy vọt thứ hai xảy ra:
Nếu giây nhuận được hỗ trợ bởi cả hai hệ điều hành và các mã ứng dụng, sau đó nó có thể thực hiện một show giây như :60
hoặc :61
. Nhưng hầu như không có triển khai thực sự nào về điều này bởi vì các ngôn ngữ lập trình thường chỉ cho phép giây trôi qua là :59
.
Hệ điều hành có thể "đóng băng" trong một giây, cho cùng một giá trị trong một giây.
Hệ điều hành có thể tiến lên :59.999
và sau đó nhảy trở lại :59.000
để lặp lại khoảng thời gian được bao phủ bởi bước nhảy vọt thứ hai. (nhờ @Teo)
Hệ điều hành có thể "trôi" hoặc "bôi nhọ" một lúc, từ từ thêm vài phần nghìn giây vào đồng hồ hệ thống, cho đến khi nó hoàn toàn bắt kịp giây thứ hai.
Hệ điều hành có thể bỏ qua ngay và không làm gì cả. Đồng hồ của bạn sẽ không đồng bộ hóa cho đến lần đồng bộ hóa tiếp theo qua NTP. Và nếu nó xảy ra để đồng bộ ngay tại thời điểm bước nhảy vọt thứ hai, nó có lẽ sẽ chỉ cần đặt thời gian để :59
hoặc :00
và một lần nữa được ra khỏi đồng bộ cho một lúc.
Hãy xem xét một ví dụ thực tế. Giá trị 1341100800000
đại diện cho ngày 1 tháng 7 năm 2012 chính xác vào nửa đêm UTC. (Bạn có thể kiểm tra nó trên this web site, hoặc trong mã Java hoặc Joda của bạn để xác minh.) Nếu chúng tôi chia cho 86400000, chúng tôi sẽ nhận được chính xác 15522 ngày đã trôi qua kể từ 1/1/1970 UTC.
Giá trị này là bao gồm trong số 35 giây nhảy vọt, bao gồm giây đã xảy ra chỉ một giây trước khi kết thúc vào ngày 30 tháng 6 năm 2012. Giống như giây nhảy vọt không bao giờ xảy ra chút nào.
Vì vậy, hầu hết thời gian, bạn không cần phải lo lắng về giây nhảy vọt. Giả vờ họ không tồn tại. Hãy để hệ điều hành của bạn xử lý chúng theo bất kỳ cách nào nó muốn.
Nếu bạn yêu cầu phép đo thời gian cực chính xác, có lẽ trong ngữ cảnh khoa học, thì bạn không nên sử dụng đồng hồ hệ thống của máy tính. Bên cạnh thực tế là bước nhảy vọt thứ hai có thể được tổ chức, kéo dài, hoặc bỏ qua, nó chỉ không được thiết kế để được rằng chính xác của một bộ đếm thời gian. Thay vào đó, bạn có lẽ nên làm việc với một số phần cứng chấm công rất chuyên dụng, chẳng hạn như phần cứng được cung cấp bởi this vendor.
Cập nhật: Nơi bạn có thể cần giải quyết giây nhảy là nếu bạn ghi nhanh sự kiện (nhiều sự kiện mỗi giây) và nếu hệ điều hành của bạn có hành vi được mô tả trong # 3 ở trên. Trong trường hợp đó, đề xuất của tôi sẽ không sắp xếp theo dấu thời gian, mà thay vào đó, hãy cân nhắc việc giữ một số thứ tự tăng dần đơn điệu riêng của bạn và sắp xếp theo thứ tự đó.
Ví dụ: bạn có thể đã có ID số nguyên gia tăng tự động trong cơ sở dữ liệu của mình. Bạn vẫn có thể lọc theo dấu thời gian trong mệnh đề where để nhận dữ liệu cho một ngày cụ thể nhưng sau đó bạn sẽ đặt hàng theo ID để các sự kiện trong chuỗi ngay cả khi dấu thời gian không.
Để có các đề xuất khác, hãy xem Teo's answer.
+1 nhưng thực hiện điều này trên lớp db có thể dễ dàng hơn (suy nghĩ của ORA-04091 nổi tiếng: bảng XXXX bị tắt, kích hoạt/chức năng có thể không nhìn thấy nó) –
Hãy nghĩ về nó có thể nó thực sự đơn giản hơn tôi nghĩ. Việc kiểm tra bước nhảy vọt thứ hai cũng có thể được mã hóa cứng trong mã chèn SQL. Vấn đề duy nhất (mà không phải là một vấn đề ở tất cả) sẽ được đọc (và tăng trong cơ sở dữ liệu chính nó) một số 'smear' (số mili giây bạn giả tạo thêm). – Sandman
@ HAL9000: lỗi "kích hoạt đột biến" thường phát sinh khi mọi người không hiểu rằng Oracle có trình kích hoạt cấp hàng không cần bất kỳ DML nào trên bảng được kích hoạt.Và mã trên có thể thay đổi thời gian cho một hàng duy nhất mà không gặp bất kỳ vấn đề nào (mặc dù tôi sẽ không sử dụng trình kích hoạt - một quy trình xử lý mọi thứ sẽ là lựa chọn tốt hơn) –