2012-10-17 45 views
11

tôi có phương pháp ASP.Net MVC điều khiển sau:Chuyển đổi UTC DateTime để DateTime địa phương

public ActionResult DoSomething(DateTime utcDate) 
{ 
    var localTime = utcDate.ToLocalTime(); 
} 

Vấn đề là localtime sẽ có giá trị chính xác giống như utcDate. Tôi cho rằng điều này là do utcDate không biết nó có giá trị UTC. Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể chuyển đổi utcDate (mà tôi BIẾT là UTC) vào địa phương?

+0

bạn biết gì múi giờ bạn đang ở trong – elyashiv

Trả lời

35

Nếu bạn biết các DateTime chứa một giá trị tính theo giờ UTC, bạn có thể sử dụng the following:

DateTime iKnowThisIsUtc = whatever; 
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc, 
    DateTimeKind.Utc); 
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime(); 

Ví dụ, trong ứng dụng hiện tại của tôi, tôi tạo dấu thời gian trong cơ sở dữ liệu của tôi với SQL utcnow, nhưng khi tôi đọc chúng vào ứng dụng C# của mình, Kind proeprty luôn là Unknown. Tôi đã tạo ra một hàm bao bọc để đọc dấu thời gian, cố tình đặt Kind thành Utc và sau đó chuyển đổi nó thành giờ địa phương - về cơ bản như trên.

Lưu ý rằng DateTime.ToLocalTime() chỉ không ảnh hưởng đến giá trị nếu một (hoặc cả hai) những điều sau đây giữ:

  • Kind Khách sạn DateTime 's là DateTimeKind.Local
  • múi giờ địa phương của bạn là như vậy mà "không thay đổi "là chuyển đổi chính xác

Tôi nghĩ chúng ta có thể giả định điểm thứ hai là không đúng sự thật. Do đó có vẻ như thuộc tính của iKnowThisIsUtc được đặt thành Local rồi. Bạn cần phải tìm ra lý do tại sao bất cứ điều gì là cung cấp cho bạn với những DateTime s nghĩ rằng họ là địa phương.

+0

NB AFAIK cách duy nhất 'ToLocalTime() 'sẽ _not change_ giá trị là nếu thời gian chạy cho rằng thời gian là _already local _. * (I.e. nó có 'DateTimeKind.Local'.) Bạn có thể muốn kiểm tra xem đây có phải là trường hợp không, và nếu có, tại sao những ngày bạn nhận được được đánh dấu là' Local 'mặc dù chúng không có. (* hoặc nếu giờ địa phương là UTC tất nhiên) – Rawling

+0

+1 để đánh tôi với lời giải thích bạn đã thêm vào trong bình luận, mặc dù tôi thực sự nghĩ nó thuộc về một phần của câu trả lời. –

+0

Khi tôi nhìn vào điều này một lúc trở lại, tôi thấy nó rất khó hiểu. Câu trả lời của bạn làm một công việc tốt như giải thích nó, nhưng một số ví dụ có lẽ sẽ giúp đỡ. – TylerOhlsen

3

Hãy thử như sau:

public static DateTime UtcToPacific(DateTime dateTime) 
     { 
      return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")); 
     } 

Rõ ràng thay đổi Pacific múi giờ địa phương của bạn.

Nếu bạn muốn tìm hiểu những gì múi giờ có mặt trên máy tính của bạn xem liên kết sau: http://msdn.microsoft.com/en-us/library/bb397781.aspx

1

hay này:.

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0)) 
        .ToLocalTime().DateTime; 
Các vấn đề liên quan