Tôi không phải là python hay Django guru, vì vậy có lẽ ai đó có thể trả lời tốt hơn tôi. Nhưng dù sao thì tôi cũng sẽ đoán nó.
Bạn nói rằng bạn đang lưu trữ nó trong Django DateTimeField
, theo tài liệu bạn đã tham khảo
, lưu trữ nó dưới dạng một datetime
trong Python .
Xem xét tài liệu cho datetime
, Tôi nghĩ điều quan trọng là hiểu được sự khác biệt giữa giá trị "ngây thơ" và "có nhận thức".
Và sau đó nghiên cứu thêm, tôi đã tìm thấy tài liệu tham khảo tuyệt vời này
. Hãy chắc chắn rằng bạn đã đọc phần thứ hai, "Đối tượng ngày giờ ngây thơ và nhận biết". Điều đó cung cấp một chút bối cảnh cho việc Django đang kiểm soát bao nhiêu điều này. Về cơ bản, bằng cách đặt USE_TZ = true
, bạn đang yêu cầu Django sử dụng tính năng nhận thức lịch hẹn ngày thay vì ngây thơ những cái.
Vì vậy, sau đó tôi nhìn lại câu hỏi của bạn. Bạn cho biết bạn đang làm như sau:
dt = datetime.fromtimestamp(secs)
dt = dt.replace(tzinfo=utc)
Nhìn vào fromtimestamp tài liệu chức năng, tôi đã tìm thấy đoạn văn bản này:
Vì vậy, tôi nghĩ bạn có thể làm điều này:
dt = datetime.fromtimestamp(secs, tz=utc)
Sau đó, một lần nữa, ngay bên dưới hàm đó, tài liệu hiển thị utcfromtimestamp
, vì vậy có lẽ nó phải là:
dt = datetime.utcfromtimestamp(secs)
Tôi không biết đủ về python để biết liệu chúng có tương đương hay không, nhưng bạn có thể thử và xem liệu một trong hai có tạo ra sự khác biệt hay không.
Hy vọng rằng một trong những điều này sẽ tạo ra sự khác biệt. Nếu không, vui lòng cho tôi biết. Tôi rất quen thuộc với ngày / giờ trong JavaScript và trong .Net, nhưng tôi luôn quan tâm đến việc các sắc thái này diễn ra khác nhau như thế nào trong các nền tảng khác, chẳng hạn như Python.
Cập nhật
Về phần MySQL của câu hỏi, hãy xem câu hỏi này .
CREATE TABLE foo (`date` DATETIME);
INSERT INTO foo (`date`) VALUES (FROM_UNIXTIME(1371131402));
SET TIME_ZONE="+00:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
SET TIME_ZONE="+01:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
Kết quả:
DATE UNIX_TIMESTAMP(`DATE`)
June, 13 2013 13:50:02+0000 1371131402
June, 13 2013 13:50:02+0000 1371127802
Có vẻ như hành vi của UNIX_TIMESTAMP
thực sự bị ảnh hưởng bởi MySQL TIME_ZONE
cài đặt. Điều đó không quá ngạc nhiên, vì nó có trong tài liệu. Điều đáng ngạc nhiên là đầu ra chuỗi của datetime
có cùng giá trị UTC bất kể cài đặt như thế nào.
Đây là những gì tôi nghĩ đang xảy ra. Trong tài liệu cho UNIX_TIMESTAMP
hàm, nó nói:
Lưu ý rằng nó không nói rằng nó có thể là DATETIME
- nó cho biết có thể là DATETIME
chuỗi . Vì vậy, tôi nghĩ rằng giá trị thực được chuyển đổi hoàn toàn thành một chuỗi trước khi được chuyển vào hàm.
Vì vậy, bây giờ hãy xem fiddle cập nhật này chuyển đổi rõ ràng.
SET TIME_ZONE="+00:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
SET TIME_ZONE="+01:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
Kết quả:
DATE CONVERT(`DATE`, CHAR) UNIX_TIMESTAMP(CONVERT(`DATE`, CHAR))
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371131402
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371127802
Bạn có thể thấy rằng khi nó chuyển đổi thành dữ liệu ký tự, nó sẽ loại bỏ phần bù. Vì vậy, tất nhiên, bây giờ có lý khi UNIX_TIMESTAMP
lấy giá trị này làm đầu vào, nó giả sử cài đặt múi giờ địa phương và do đó nhận được dấu thời gian UTC khác.
Không chắc chắn nếu điều này sẽ giúp bạn hay không. Bạn cần tìm hiểu thêm về cách Django gọi MySQL cho cả phần đọc và ghi. Nó có thực sự sử dụng UNIX_TIMESTAMP
không hàm số? Hay đó chỉ là những gì bạn đã làm trong quá trình thử nghiệm?