2010-03-30 86 views
23

Tôi có giá trị UTC DateTime từ bản ghi cơ sở dữ liệu. Tôi cũng có một múi giờ do người dùng chỉ định (một thể hiện của TimeZoneInfo). Làm cách nào để chuyển đổi UTC DateTime đó thành múi giờ địa phương của người dùng? Ngoài ra, làm cách nào để xác định xem múi giờ do người dùng chỉ định có đang quan sát DST không? Tôi đang sử dụng .NET 3.5.Chuyển đổi UTC DateTime thành múi giờ khác

Cảm ơn, Đánh dấu

Trả lời

20

Hãy nhìn vào cấu trúc DateTimeOffset:

// user-specified time zone 
TimeZoneInfo southPole = 
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time"); 

// an UTC DateTime 
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc); 

// DateTime with offset 
DateTimeOffset dateAndOffset = 
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime)); 

Console.WriteLine(dateAndOffset); 

Đối với DST thấy phương pháp TimeZoneInfo.IsDaylightSavingTime.

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow); 
+0

tôi phải đi thêm một bước phụ để có được thời gian địa phương của tôi: var offset = tzi.GetUtcOffset (utcTime); var siteLocalTime = utcTime.Add (offset); trang web trả vềLocalTime.ToString ("MM/dd/yyyy HH: mm"); –

+5

Mã này không biên dịch. Id múi giờ đó không tồn tại và nếu bạn thay thế nó bằng giá trị hợp lệ thì bạn sẽ gặp lỗi về 'Trường hợp UTC Offset cho Utc DateTime phải là 0'. –

+0

để tránh lỗi trong dateAndOffset chọn DateTime cstTime = utcTime.AddTicks (southPole.BaseUtcOffset.Ticks); –

11

Câu trả lời Antartica chỉ hoạt động cho múi giờ khớp với UTC. Tôi khá bị tổn thương với chức năng DateTimeOffset này và sau nhiều giờ dùng thử và lỗi, tôi đã quản lý để tạo ra một chức năng mở rộng chuyển đổi thực tế hoạt động với tất cả các múi giờ.

static public class DateTimeFunctions 
{ 
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc) 
    { 
     if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc"); 
     var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime); 
     var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified); 
     return new DateTimeOffset(convertedTime, toUtcOffset); 
    } 
} 

Ví dụ:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time"); 
+5

'tĩnh công cộng'? HERESY, BURN THE WITCH –

20

Bạn có thể sử dụng một chức năng chuyên dụng trong vòng TimeZoneInfo nếu bạn muốn chuyển đổi một DateTimeOffset vào một DateTimeOffset:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 
); 
24

Cách tốt nhất để làm điều này chỉ đơn giản là để sử dụng TimeZoneInfo.ConvertTimeFromUtc.

// you said you had these already 
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0); 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 

// it's a simple one-liner 
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi); 

Trở ngại duy nhất là giá trị đến DateTime có thể không có các loại DateTimeKind.Local. Nó phải là Utc hoặc Unspecified.

0
 // TO get Currrent Time in current Time Zone of your System 

     var dt = DateTime.Now; 

     Console.WriteLine(dt); 

     // Display Time Zone of your System 

     Console.WriteLine(TimeZoneInfo.Local); 

     // Convert Current Date Time to UTC Date Time 

     var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local); 

     Console.WriteLine(utc); 

     // Convert UTC Time to Current Time Zone 

     DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local); 

     Console.WriteLine(pacific); 

     Console.ReadLine(); 
Các vấn đề liên quan