2008-10-27 43 views
5

Chúng tôi có một ứng dụng web ASP.Net 2.0 và chạy với máy chủ ở Midwest (Giờ chuẩn miền Đông). Tại thời điểm này, tất cả khách hàng của chúng tôi đều ở cùng múi giờ với máy chủ. Chúng tôi đang đưa một máy chủ khác trực tuyến tại Arizona (Giờ chuẩn miền núi).Múi giờ ứng dụng web phát hành

Chúng tôi lưu trữ tất cả thời gian của mình trong cơ sở dữ liệu SQL 2005 qua C# codebehind DateTime.UtcNow.

Trong khi thử nghiệm, chúng tôi gặp phải một số vấn đề về chuyển đổi múi giờ. Vấn đề của chúng tôi là trong trình duyệt web, thời gian của chúng tôi hiển thị Giờ chuẩn miền núi thay vì múi giờ chúng tôi đang thử nghiệm từ Giờ chuẩn miền Đông.

Khi nhập thông tin mới, thông tin sẽ được lưu dưới dạng UTC trong cơ sở dữ liệu, nhưng khi chúng tôi xem thông tin đó trong trình duyệt, nó sẽ hiển thị Giờ chuẩn miền núi. Dưới đây là mã lấy giá trị UTC từ cơ sở dữ liệu và hiển thị nó trong trình duyệt.

lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString(); 

Mã trên trả về Giờ chuẩn miền núi nơi máy chủ không phải là Giờ chuẩn miền đông nơi trình duyệt đang chạy. Làm cách nào để chúng tôi có thời gian hiển thị khi người dùng ở đâu?

Trả lời

6

Tôi gặp vấn đề tương tự. Chúng tôi đã bán ứng dụng của mình cho người dùng ở múi giờ khác với máy chủ web. Chúng tôi không lưu trữ bất kỳ thông tin thời gian nào trong UTC, nhưng nó thực sự hoạt động chính xác. Thời gian được hiển thị trong múi giờ của máy chủ hiển thị chính xác sau 3 giờ. Tất cả những gì chúng tôi phải làm là thêm một vùng thả xuống múi giờ để họ có thể chọn múi giờ của họ cho toàn bộ trang web (vì người dùng duy nhất của ứng dụng sẽ nằm trong múi giờ của họ). Chúng tôi đã lưu cài đặt này và sau đó chèn một hàm để lấy tất cả các hiển thị ngày giờ và chuyển đổi từ một múi giờ này sang múi giờ khác bằng không gian tên TimeZoneInfo. Nó hoạt động hoàn hảo.

2

Nếu bạn đang sử dụng .NET 3.5 bạn biết múi giờ mà người dùng đang ở, TimeZoneInfo là bạn của bạn. Nếu bạn không sử dụng .NET 3.5, có một số mẫu P/Invoke xung quanh để có các phiên bản TimeZone, nhưng bạn nên tránh nếu bạn có quyền truy cập vào 3.5. (TimeZoneInfo có dữ liệu lịch sử, vv và thường là cách ưa thích để tiếp tục.)

Bây giờ xác định múi giờ mà người dùng của bạn đang ở là một vấn đề khác - cách đơn giản nhất để tránh nhầm lẫn là cung cấp cho họ các tùy chọn. (Nhận bù đắp "bây giờ" chỉ cung cấp cho bạn thông tin giới hạn.)

+0

Điểm tuyệt vời Jon. –

3

Đến giờ địa phương sẽ luôn ở phía máy chủ chuyển đổi thành vị trí thực. Bạn có một vài lựa chọn.

  1. Store giá trị bù đắp từ UTC để những người sử dụng, giữ lần trong UTC
  2. Do phía khách hàng chuyển đổi qua JS (Không tao nhã, cũng không thích hợp, Theo ý kiến ​​của tôi)
  3. Nhìn vào một số MSDN recommendations và Không gian tên múi giờ
2

Tôi đã gặp phải điều gì đó như thế này trước khi sử dụng ASP.NET. Đây là phương pháp chung của tôi.

Tôi đã gửi JavaScript để thực hiện một document.write. JavaScript xác định chênh lệch của khách hàng từ GMT. Vì vậy, bạn có thể gửi một thời gian cụ thể và sau đó để cho JavaScript làm một cộng/trừ vào nó.

0

Chúng tôi gặp sự cố tương tự hoặc tương tự với khách hàng ở xa gọi đến cơ sở dữ liệu của chúng tôi thông qua các dịch vụ web nơi cơ sở dữ liệu và khách hàng ở các múi giờ khác nhau.

Chúng tôi tìm thấy nó dễ dàng nhất để hướng dẫn các số liệu để không quan tâm đến các múi giờ nên lần này không thay đổi qua biên giới múi giờ ...

Chúng tôi xây dựng một phương pháp hữu ích (SetAllDateModes) có thể chuyển đổi tất cả các lĩnh vực ngày-thời gian trong dataset bằng bảng - đây là kết thúc kinh doanh (Foreach) và cuộc gọi mà đặt dateMode:

foreach (DataColumn dc in dt.Columns) 
{ 
    if (dc.DataType == typeof(DateTime)) 
    { 
    dc.DateTimeMode = dateMode; 
    } 
} 
SetAllDateModes(dt, DataSetDateTime.Unspecified); 

DateSetDateTime.Unspecified không bao gồm bù đắp vì vậy không có chuyển đổi.

0

Tôi nghĩ ý tưởng chung là không bản địa hóa ngày & thời gian cho đến khi bạn trình bày cho người dùng. Vì vậy, trừ khi một con người sẽ đọc nó, nó vẫn ở dạng UTC, GMT, CUT. Một lưu ý bổ sung là sử dụng thư viện Ngày/Giờ để bạn không phải lo lắng nhiều về vấn đề thay đổi thời gian tiết kiệm ánh sáng ban ngày.

1

Chỉ cần luôn lưu trữ ngày giờ như định dạng GMT.

Có 2 bước sau:

Detect múi giờ khác nhau ở bên cạnh khách hàng sử dụng Javascript:

var dt = new Date(); 
var diffInMinutes = -dt.getTimezoneOffset(); 

Sau đó, ở phía máy chủ, mã C# để chuyển đổi thời gian máy chủ thời gian của khách hàng dựa trên múi giờ phát hiện bù đắp trên:

string queryStr = Request.QueryString["diffInMinutes"]; 
int diffInMinutes = 0; 
if (Int32.TryParse(queryStr, out diffInMinutes)) 
{ 
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes); 
} 
Các vấn đề liên quan