Tôi có một trang web được lưu trữ ở múi giờ khác với người dùng sử dụng ứng dụng. Ngoài ra, người dùng có thể có múi giờ cụ thể. Tôi đã tự hỏi làm thế nào người dùng và ứng dụng SO khác tiếp cận điều này? Phần rõ ràng nhất là bên trong DB, ngày / giờ được lưu trữ trong UTC. Khi trên máy chủ, tất cả ngày / giờ nên được xử lý trong UTC. Tuy nhiên, tôi thấy ba vấn đề mà tôi đang cố gắng khắc phục:
Lấy thời gian hiện tại trong UTC (giải quyết dễ dàng với
DateTime.UtcNow
).Kéo ngày / lần từ cơ sở dữ liệu và hiển thị chúng cho người dùng. Có khả năng rất nhiều cuộc gọi để in ngày trên các chế độ xem khác nhau. Tôi đã suy nghĩ về một số lớp ở giữa chế độ xem và bộ điều khiển có thể giải quyết vấn đề này. Hoặc có một phương thức mở rộng tùy chỉnh trên
DateTime
(xem bên dưới). Mặt trái chính là ở mọi vị trí sử dụng datetime trong chế độ xem, phương thức mở rộng phải được gọi!Điều này cũng sẽ thêm khó khăn để sử dụng một cái gì đó như
JsonResult
. Bạn không còn có thể dễ dàng gọiJson(myEnumerable)
, nó sẽ phải đượcJson(myEnumerable.Select(transformAllDates))
. Có lẽ AutoMapper có thể giúp đỡ trong tình huống này?Nhận đầu vào từ người dùng (Cục bộ đến UTC). Ví dụ: Đăng một biểu mẫu có ngày sẽ yêu cầu chuyển đổi ngày thành UTC trước đó. Điều đầu tiên xuất hiện trong tâm trí là tạo ra một tùy chỉnh
ModelBinder
.
Đây là các tiện ích mở rộng mà tôi nghĩ sẽ sử dụng trong các chế độ xem:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Tôi nghĩ rằng việc xử lý các múi giờ sẽ là một điều phổ biến khi xem xét rất nhiều ứng dụng hiện đang dựa trên đám mây trong đó giờ địa phương của máy chủ có thể khác nhiều so với múi giờ dự kiến.
Điều này đã được giải quyết thanh lịch trước đây? Có điều gì tôi đang thiếu? Ý tưởng và suy nghĩ được nhiều đánh giá cao.
EDIT: Để xóa một số nhầm lẫn tôi nghĩ thêm một số chi tiết. Vấn đề bây giờ không phải là làm thế nào để lưu trữ thời gian UTC trong db, mà là về quá trình đi từ UTC-> Địa phương và Địa phương-> UTC. Như @Max Zerbini chỉ ra, rõ ràng là thông minh khi đặt UTC-> Mã cục bộ trong chế độ xem, nhưng có DateTimeExtensions
thực sự sử dụng câu trả lời không? Khi nhận đầu vào từ người dùng, có nghĩa là chấp nhận ngày là giờ địa phương của người dùng (vì đó là thứ mà JS sẽ sử dụng) và sau đó sử dụng một ModelBinder
biến đổi thành UTC? Múi giờ của người dùng được lưu trữ trong DB và dễ dàng lấy ra.
ModelBinder
.