Đây là một vấn đề quan trọng và đáng ngạc nhiên khó khăn. Sự thật là không có tiêu chuẩn hoàn toàn thỏa mãn cho thời gian bền bỉ. Ví dụ, tiêu chuẩn SQL và định dạng ISO (ISO 8601) rõ ràng là không đủ.
Từ quan điểm khái niệm, người ta thường xử lý hai loại dữ liệu thời gian và rất thuận tiện để phân biệt chúng (các tiêu chuẩn trên không): " thời gian thực " và " thời gian dân sự ".
Một thời gian "vật lý" là một điểm trong dòng thời gian phổ quát liên tục mà vật lý đối phó (tất nhiên bỏ qua tính tương đối). Ví dụ, khái niệm này có thể được mã hóa đầy đủ trong UTC (nếu bạn có thể bỏ qua giây nhuận).
Thời gian "dân sự" là một đặc tả thời gian theo các chỉ tiêu dân sự: một điểm thời gian ở đây được chỉ định đầy đủ bởi một tập các trường thời gian (Y, M, D, H, MM, S, FS) cộng với TZ (đặc tả múi giờ) (thực ra cũng là "lịch", nhưng giả sử chúng ta hạn chế thảo luận về lịch Gregorian). Một múi giờ và lịch cùng cho phép (về nguyên tắc) ánh xạ từ đại diện này sang đại diện khác. Nhưng các yếu tố thời gian dân sự và vật lý là các loại cường độ khác nhau về cơ bản, và chúng nên được giữ tách biệt về mặt khái niệm và đối xử khác nhau (một dạng tương tự: mảng byte và chuỗi ký tự).
Vấn đề là khó hiểu bởi vì chúng ta nói về các loại sự kiện này thay thế cho nhau, và bởi vì thời gian dân sự có thể thay đổi chính trị. Vấn đề (và sự cần thiết phải phân biệt các khái niệm này) trở nên rõ ràng hơn cho các sự kiện trong tương lai. Ví dụ (lấy từ cuộc thảo luận của tôi ở đây .
John ghi lại trong lịch của mình một lời nhắc cho một số sự kiện tại datetime
2019-Jul-27, 10:30:00
, TZ = Chile/Santiago
, (đã bù GMT-4, do đó nó tương ứng với UTC 2019-Jul-27 14:30:00
). Nhưng một ngày nào đó trong tương lai, quốc gia này quyết định thay đổi bù TZ thành GMT-5.
Bây giờ, khi ngày đến ... nên nhắc nhở đó kích hoạt tại
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
hoặc là
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
Không có câu trả lời chính xác, trừ khi người ta biết ý nghĩa của John khi nói với lịch "Xin hãy gọi cho tôi tại 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
".
Có phải anh ta có nghĩa là "thời gian dân sự" ("khi đồng hồ trong thành phố của tôi nói 10:30")? Trong trường hợp đó, A) là câu trả lời đúng.
Hay ông có nghĩa là "tức thời vật lý", một điểm trong dòng thời gian tiếp diễn của vũ trụ chúng ta, nói, "khi nhật thực tiếp theo xảy ra". Trong trường hợp đó, câu B) là câu đúng.
Một vài API Ngày / Giờ có được sự khác biệt này: trong số đó, Jodatime , là nền tảng của API DateTime Java (thứ ba!) Tiếp theo (JSR 310).
GETDATE()
trên SQL sẽ là UTC (như ý muốnDateTime.Now
). Và máy chủ sẽ không bị ảnh hưởng bởi bất kỳ loại thay đổi DST tự động nào.