Tại sao múi giờ lại có sự bù trừ điên rồ như vậy từ năm U01 vào năm 0001 trong Postgres?


16

Trong Postgres 9.5, tôi đã rất ngạc nhiên khi thấy kết quả được nhìn thấy bên dưới trong khi thử nghiệm với năm 0001(không có năm nào 0000).

Bù đắp -07:52:58?

Một số ví dụ mã. Lưu ý rằng tôi đã sử dụng hỗn hợp TIMESTAMP WITH TIME ZONETIMESTAMP WITHOUT TIME ZONE, vì vậy hãy đọc kỹ.

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

Tôi ngạc nhiên bởi giá trị thứ hai đó : 0001-12-31 16:07:02-07:52:58 BC. Tôi hiểu rằng chúng ta phải quay ngược tám giờ so với America/Los_Angelestám giờ sau UTC với mức bù là -08:00. Nhưng thay vì -08:00bù là được -07:52:58. Tại sao?

Không có vấn đề theo UTC

Không có vấn đề như vậy khi nhập dữ liệu theo UTC.

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

Không năm không

Nhân tiện, phần ngày dường như là chính xác. Dường như không có năm nào 0000, đó là điểm mấu chốt giữa thời đại của BC BC và thời điểm AD AD. Lấy khoảnh khắc đầu tiên của năm 0001, trừ đi một giờ và bạn có được năm 0001 BC- vì vậy không có năm nào.

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

Kết quả là năm 0001 BC, vì vậy chúng tôi nhảy từ 0001để 0001 BC; không có năm zero 0000.

"0001-12-31 23:00:00+00 BC"

Ngoài ra, một video hay về sự điên rồ của múi giờ
billinkc

Điểm mấu chốt giữa BC và AD là năm 1. Đó là năm 1 hoặc năm -1. Đó chỉ là cách năm được đặt tên ban đầu. Năm 0 không tồn tại (hay đúng hơn là không xác định do đó là vấn đề định nghĩa nhiều hơn là tồn tại).
slebetman

Hãy nhớ lại cách trở lại trong lễ kỷ niệm năm 2000 khi một số người phạm tội nói rằng thiên niên kỷ thứ hai về mặt kỹ thuật bắt đầu vào năm 2001 chứ không phải năm 2000? Đó là lý do tại sao. Năm bắt đầu từ 1, không phải 0. Và năm trước năm 1 là năm 1 trước Công nguyên (tức là năm -1)
slebetman

1
@slebetman phụ thuộc vào lịch sử dụng. Gregorian proleptic có cả hình thức sử dụng 0 như năm trước 1 CE và hình thức đặt 1 BCE ngay trước 1 CE (ISO 8601 hỗ trợ cả hai trong việc có 0000giá trị năm hợp lệ nhưng không nhấn mạnh vào việc nó có được sử dụng hay không ). Đúng là PostgreSQL sử dụng biểu mẫu không có năm 0, nhưng bạn không thể nói "năm bắt đầu 1, không phải 0" như thể đó là một loại thực tế phổ biến. Thật dễ dàng để dịch giữa chúng ví dụ như dữ liệu thiên văn. (Thiên niên kỷ thứ ba vẫn bắt đầu vào năm 2001, vì nó vẫn là thiên niên kỷ thứ ba kể từ 1 CE)
Jon Hanna

@JonHanna: Tuy nhiên, không ai thực sự sử dụng bất kỳ hình thức lịch Gregorian phổ biến nào vào thời điểm đó, vì vậy tôi nghĩ thật công bằng khi ưu tiên lịch Julian ở đây - không có năm nào.
Kevin

Câu trả lời:


22

Vào ngày 18 tháng 11 năm 1883 lúc 12:00 (thời gian mới), thời gian tiêu chuẩn đã được thông qua bởi đường sắt Mỹ.

Điều này có nghĩa là trước thời điểm đó, Los Angeles đã sử dụng giờ địa phương thực tế, dựa trên thời gian mặt trời trung bình. Sau đó, nó được chuyển sang múi giờ địa phương, là phần bù giờ không thể tách rời so với Giờ trung bình Greenwich, hơi khác so với lần trước.

Bạn muốn biết thêm?

  • Tải xuống Cơ sở dữ liệu múi giờ tzdata từ IANA: Múi giờ .

  • Bên trong, bạn sẽ tìm thấy các định nghĩa về (nhiều) múi giờ, có rất nhiều biến thể theo thời gian, cùng với rất nhiều bình luận nêu chi tiết những thay đổi ở đâu và khi nào. Đó là cách đọc giải trí!

  • Wikipedia có cũng có một số sự kiện thú vị, trong Wikipedia: Múi giờ trang, liên quan đến sự thay đổi năm 1883, ngày 18 tháng 11:

Thời gian đường sắt
...
Máy chấm công trên đường sắt Mỹ vào giữa thế kỷ 19 có phần bị nhầm lẫn. Mỗi đường sắt sử dụng thời gian tiêu chuẩn riêng của mình, thường dựa trên thời gian địa phương của trụ sở chính hoặc ga cuối quan trọng nhất và lịch trình xe lửa của đường sắt đã được công bố sử dụng thời gian riêng của mình. Một số nút giao được phục vụ bởi một số tuyến đường sắt có đồng hồ cho mỗi đường sắt, mỗi nút hiển thị thời gian khác nhau.
... Hệ thống của Dowd không bao giờ được chấp nhận bởi đường sắt Mỹ. Thay vào đó, đường sắt Hoa Kỳ và Canada đã triển khai một phiên bản được đề xuất bởi William F. Allen, biên tập viên của Hướng dẫn đường sắt chính thức của Traveler. Biên giới của các múi giờ của nó chạy qua các nhà ga đường sắt, thường ở các thành phố lớn. Ví dụ: biên giới giữa các múi giờ miền Đông và miền Trung chạy qua Detroit, Buffalo, Pittsburgh, Atlanta và Charleston. Nó được khánh thành vào Chủ nhật, ngày 18 tháng 11 năm 1883 , còn được gọi là "Ngày của hai buổi trưa" , khi mỗi đồng hồ của nhà ga đường sắt được đặt lại khi đạt đến giờ trưa tiêu chuẩn trong từng múi giờ. Các khu vực được đặt tên là Intercolonial, Đông, Trung, Núi và Thái Bình Dương. ...

Cũng lưu ý rằng điều này không cụ thể đối với Postgresql. Điều này hợp lệ đối với bất kỳ phần mềm hoặc hệ điều hành nào sử dụng cơ sở dữ liệu tzdata (mặc dù tất nhiên nhiều phần sẽ bị giới hạn vào ngày sau năm 1970 hoặc sau năm 1901, vì vậy năm 1883 nằm ngoài tầm với, nhưng có rất nhiều điều chỉnh khác ở khắp mọi nơi thời điểm khác nhau).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.