2013-07-31 35 views
6

tôi có một giải pháp của ba dự án:Chuyển đổi UTC tới giờ địa phương trả về kết quả kỳ lạ

  1. Lõi
  2. Outlook Add-In
  3. ASP.NET website

Cả, Outlook Add-In và trang web sử dụng các phương thức tương tự từ dự án Core để lấy dữ liệu từ SQL Server. Khi tôi ghi dữ liệu của tôi vào cơ sở dữ liệu, tôi chuyển đổi tất cả DateTime giá trị của hai bảng vào thời gian tính theo giờ UTC:

POLL_START    POLL_END 
2013-07-31 12:00:00.000 2013-08-01 12:00:00.000 

PICK_DATE 
2013-07-31 12:00:48.000 
2013-07-31 13:00:12.000 

Khi tôi nhận được dữ liệu trong Outlook của tôi Add-In, đây là đúng kết quả:

enter image description here enter image description here

Khi mở như nhau trong trang web của tôi, chọn cũng tốt:

enter image description here

Nhưng bắt đầu của tôi và kết thúc thời là "bị hỏng" - những bù đắp được thêm vào, Bute giờ sai được sử dụng:

enter image description here

Dưới đây là đoạn code để chuyển đổi của tôi, rằng cả hai, Outlook và các trang web, sử dụng:

private static void ConvertToLocalTime(POLL item) 
{ 
    item.POLL_START = item.POLL_START.FromUTC(); 
    item.POLL_END = item.POLL_END.FromUTC(); 
} 

private static void ConvertToLocalTime(PICK pick) 
{ 
    if (pick.PICK_DATE != null) pick.PICK_DATE = ((DateTime)pick.PICK_DATE).FromUTC(); 
} 

Và việc triển khai DateTime.FromUtc():

public static DateTime FromUTC(this DateTime value) 
{ 
    var local = TimeZoneInfo.Local; 
    return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.Utc, local); 
} 

Tôi có cùng kết quả với DateTime.ToLocalTime(). Bất kỳ ai là một ý tưởng?

EDIT 1:

Đây là cách bắt đầu và kết thúc được hiển thị trên trang web (kết thúc với End thay vì Start):

var startCell = new TableCell 
     { 
      Text = String.Format(
       @"<a href='{0}' title='{2}' target='_blank'>{1:dd.MM.yyyy HH:mm \U\T\Czzz}</a>", 
        Common.GetTimeAndDateHyperlink(_poll.Start, "Vote Start"), 
        _poll.Start, 
        ConvertToLocalTimeZone), 
      CssClass = "InfoContent" 
     }; 

Và chọn:

answerCell = new TableCell 
      { 
       Text = String.Format(
        @"<a href='{0}' title='{2}' target='_blank'>{1}</a>", 
         Common.GetTimeAndDateHyperlink(ao.Time, ao.RealAnswer), 
         ao.RealAnswer, 
         ConvertToLocalTimeZone) 
      }; 

ao.RealAnswer trả về chuỗi DateTime được định dạng:

return String.Format(WholeTime == true ? "{0:d}" : @"{0:dd.MM.yyyy HH:mm \U\T\Czzz}", Time); 
+0

Mã bạn đang sử dụng để hiển thị thời gian trên trang web của bạn là gì? – Romoku

+0

@Romoku đã thêm mã – Herdo

+0

Tôi sẽ đoán rằng thuộc tính [Loại] (http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx) khác nhau giữa hai loại. – Greg

Trả lời

1

Tôi đã giải quyết vấn đề ngay bây giờ. Giá trị DateTime cho bắt đầu và kết thúc không được chuyển đổi chính xác: Các giá trị không được chuyển thành giờ địa phương.

Lý do, tại sao các trang web hiển thị thời gian như giờ địa phương là, các cửa hàng máy chủ SQL mỗi DateTime giá trị như DateTimeKind.Unspecified thay vì giữ định dữ liệu (ví dụ DateTimeKind.Utc) trong suốt chèn. Khi đọc dữ liệu từ máy chủ, tất cả các loại là DateTimeKind.Unspecified, do đó, .ToString() của DateTime sử dụng loại địa phương. Điều này dẫn đến thời gian UTC + chênh lệch UTC cục bộ.

Các vấn đề liên quan