2010-02-15 19 views
5

Tôi đã lưu lần trong cơ sở dữ liệu sql ở định dạng utc. Tôi đang hiển thị những lần trên một GridView, tuy nhiên họ vẫn là định dạng UTC. Tôi muốn chuyển đổi chúng sang trình duyệt của khách hàng giờ địa phương. Vấn đề là mặc dù tôi có thể nhận được bù đắp múi giờ chỉ dành cho ngày/giờ hiện tại. Mức chênh lệch đó có thể thay đổi nếu một số trong những ngày đó trong tương lai kết thúc xảy ra trong thời gian tiết kiệm ánh sáng ban ngày. Tôi là tương đối mới để lập trình web nhưng có vẻ như những gì tôi cần làm là chạy một số Javascript như mỗi mục liên kết với GridView rằng bằng cách nào đó có đối tượng C# datetimeoffset và chuyển đổi nó vào một thời gian địa phương. Hoặc có lẽ điều đó là không thể?Hiển thị giờ địa phương từ thời gian utc được lưu trữ trong cơ sở dữ liệu sql trên ứng dụng asp.net

Trả lời

8

Điều này có thể được thực hiện ở phía máy chủ nếu bạn có đối tượng TimeZoneInfo. Bạn có thể sử dụng phương thức tĩnh ConvertTimeFromUtc().

Trong C#:

DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo); 

Nếu bạn không có múi giờ trên máy chủ bên mọi thứ trở nên khó khăn kể từ khi javascript không cung cấp múi giờ của khách hàng (trừ khi họ là ở Mỹ, và thậm chí sau đó chỉ trên một số trình duyệt). Trong trường hợp này, tốt nhất là buộc người dùng phải chọn múi giờ hiện tại của họ và lưu trữ múi giờ đó vào tài khoản của họ. Nếu điều này đang được hiển thị cho người dùng ẩn danh, bạn có thể hiển thị trong UTC theo mặc định và cung cấp tùy chọn để làm mới nó cho múi giờ đã chọn.

Cập nhật

Có một số vấn đề mà xuất hiện khi cố gắng để tự động xác định múi giờ của người dùng.

  1. Không cung cấp múi giờ cho máy chủ bởi tác nhân người dùng.
  2. Javascript không cung cấp quyền truy cập vào múi giờ (ngoại trừ một số trình duyệt, đôi khi).

Hàm javascript getTimezoneOffset() ban đầu có thể là một ý tưởng hay, nhưng vì có nhiều múi giờ có cùng độ lệch, đây không phải là giá trị duy nhất. Sự khác biệt giữa nhiều khu vực không độc đáo này là việc thực hiện thời gian tiết kiệm ánh sáng ban ngày.

Ví dụ: Indiana không coi DST. Vì vậy, trong nửa năm bù đắp của họ phù hợp với thời gian đông, trong khi một nửa khác bù đắp của họ là bằng thời gian trung tâm.

Tuy nhiên, nếu cơ sở người dùng của bạn nằm chủ yếu ở Mỹ và sử dụng trình duyệt IE, Chrome, Safari, Firefox, hơn bạn có thể sử dụng phương pháp toString() trên một đối tượng Date để có được những múi giờ. Các trình duyệt này gắn thêm múi giờ vào chuỗi ngày theo các cách khác nhau. Bên ngoài Hoa Kỳ, múi giờ không được bao gồm trong tất cả các trình duyệt (mặc dù một số múi giờ vẫn có thể hiển thị).

mở http://jsbin.com/onulo3 để quan sát:
IE8: Sun 14 tháng 2 22:12:22 EST 2010
Chrome: Sun ngày 14 tháng 2 2010 22:12:22 GMT-0500 (Đông Chuẩn Time)
Safari: Sun 14 Tháng Hai 2010 22:12:22 GMT-0500 (Giờ chuẩn Đông)
Firefox: Sun 14 Tháng Hai 2010 22:12:22 GMT-0500 (Đông tiêu chuẩn T ime)

Với một số phân tích cú pháp, giờ đây bạn có thể xác định múi giờ cho tất cả người dùng người Mỹ của mình. Đối với những người khác, bạn có thể hiển thị thời gian trong UTC (với thông báo về hiệu ứng đó).

+0

Tôi hy vọng sẽ làm điều đó theo cách mà người dùng không cần chỉ định múi giờ và tôi chỉ có thể nhận múi giờ từ trình duyệt của họ – JonF

+0

Chúng tôi đã dành rất nhiều thời gian để bung một cái gì đó như thế trong một dự án gần đây. Tôi sẽ thêm chi tiết vào câu trả lời của tôi, nhưng phiên bản ngắn là: nó không thể được thực hiện một cách đáng tin cậy. – Joel

-2

Dưới đây là hai cách để chuyển đổi.

Way # 1: Nếu bạn có datetime trong vài giây-từ-kỷ nguyên định dạng, chỉ cần sử dụng một cái gì đó như:

var d=new Date(seconds_since_epoch); 
document.write(d.toString()); 

Way # 2: Nếu bạn chỉ có năm, tháng, ngày, giờ, phút và giây trong thời gian UTC, sử dụng:

var d=new Date(yyyy,mo-1,dd,hh,mi,ss); // in JavaScript, January is month 0 
document.write(d.toString()); 
Các vấn đề liên quan