2010-10-27 43 views
5

Tôi đang gặp sự cố trong khi chuyển đổi ngày giữa máy chủ và ứng dụng khách của tôi, cả hai đều đang chạy ở Đức. Cài đặt vùng trên máy khách có thể được đặt thành cả Vương quốc Anh hoặc Đức. Tôi nhận được ngày từ máy chủ có định dạng CET và tôi cần đại diện cho thời gian này trên giao diện người dùng dưới dạng thời gian ở Vương quốc Anh. Ví dụ một thời gian nhận được từ máy chủ như nói, 01/07/2010 01:00:00 nên được đại diện trên giao diện người dùng như 01/07/2010 00:00:00. Tôi đã viết một công cụ chuyển đổi cho mục đích này, tuy nhiên trong khi chạy nó đang nhận được một sự khác biệt thời gian của 2 giờ.Below là mã, xin vui lòng bạn có thể giúp đỡ?Làm thế nào để đại diện cho thời gian hiện tại của Vương quốc Anh?

public class LocalToGmtConverter : IDateConverter 
{ 
    private readonly TimeZoneInfo timeZoneInfo; 

    public LocalToGmtConverter() 
     : this(TimeZoneInfo.Local) 
    { 

    } 
    public LocalToGmtConverter(TimeZoneInfo timeZoneInfo) 
    { 
     this.timeZoneInfo = timeZoneInfo; 
    } 

    public DateTime Convert(DateTime localDate) 
    { 
     var utcKind = DateTime.SpecifyKind(localDate, DateTimeKind.Utc); 
     return utcKind; 
    } 

    public DateTime ConvertBack(object fromServer) 
    { 
     DateTime serverDate = (DateTime)fromServer; 

     var utcOffset = timeZoneInfo.GetUtcOffset(serverDate); 

     var uiTime = serverDate- utcOffset; 

     return uiTime; 

    } 
} 
+1

Bạn có nhận được giờ Đức hoặc GMT từ máy chủ không? – Oded

+2

Câu hỏi liên quan: http: // stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

+2

Cách tiếp cận tốt hơn có cả thời gian trong UTC và chuyển đổi sang địa phương khi cần –

Trả lời

12

Tôi nghĩ rằng bạn đang chuyển đổi để UTC (thay vì Vương quốc Anh) thời gian. Vì vẫn còn thời gian mùa hè ở Trung Âu (sự kiện nếu nhiệt độ nói khác), sự khác biệt là +2 giờ cho đến ngày 31 tháng 10.

Nếu bạn biết rằng bạn đang chuyển đổi từ Đức sang Vương quốc Anh (nghĩa là CEST thành BST vào mùa hè và CET thành GMT vào mùa đông), tại sao bạn không chỉ trừ 1 giờ?

Nếu bạn muốn thông tin múi giờ cho Vương quốc Anh, bạn có xây dựng nó bằng cách sử

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 

Sau đó, bạn có thể chuyển đổi ngày sử dụng

var newDate = TimeZoneInfo.ConvertTime(serverDate, TimeZoneInfo.Local, britishZone); 
+1

Đúng, đúng UTC và múi giờ Anh (thường được gọi là UTC Dublin, Edinburgh, Lisbon, London trong giao diện người dùng) không giống nhau. YOu cần nhận thông tin múi giờ của Anh và cần bao gồm thời gian tiết kiệm ánh sáng ban ngày cho bạn. –

1

Sử dụng TimeZoneInfo.ConvertTime để chuyển đổi múi giờ đầu vào gốc (CET) thành múi giờ đích (Vương quốc Anh).

public static DateTime ConvertTime(
    DateTime dateTime, 
    TimeZoneInfo sourceTimeZone, 
    TimeZoneInfo destinationTimeZone 
) 

hướng dẫn đầy đủ trên MSDN here:

Chuyển đổi Times giữa khu Time

Modified mẫu mã từ MSDN:

DateTime ceTime = new DateTime(2007, 02, 01, 08, 00, 00); 
try 
{ 
    TimeZoneInfo ceZone = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard  Time"); 
    TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    Console.WriteLine("{0} {1} is {2} GMT time.", 
      ceTime, 
      ceZone.IsDaylightSavingTime(ceTime) ? ceZone.DaylightName : ceZone.StandardName, 
      TimeZoneInfo.ConvertTime(ceTime, ceZone, gmtZone)); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the required timezones."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the required timezones has been corrupted."); 
} 
0

Cách tiếp cận tốt hơn để đối phó với thời gian địa phương là cửa hàng chúng trong đại diện thống nhất như UTC.

Vì vậy, bạn có thể chuyển đổi tất cả thời gian nhập thành UTC (qua .ToUniversalTime()) và lưu trữ (hoặc truyền) giá trị của nó. Khi bạn cần hiển thị nó chỉ cần chuyển đổi trở lại bằng cách sử dụng .ToLocalTime().

Vì vậy, bạn tránh các yêu cầu để biết múi giờ nào là giá trị ban đầu và có thể dễ dàng hiển thị giá trị được lưu trữ trong các múi giờ khác nhau. Ngoài ra, bạn có thể tránh những rắc rối đến mà bạn phải viết logic cụ thể cho thời gian xử lý trong múi giờ tiếp theo cố gắng tìm ra cách để chuyển đổi chúng trong số tất cả có sẵn.

+0

Tôi nghĩ rằng vấn đề ở đây là anh ta không muốn nó trong thời gian địa phương, anh ấy ở Đức (CET) và muốn hiển thị thời gian ở Anh (GMT). –

+0

@Steve Haigh, nhờ vào điểm, nhưng anh ta có thể chuyển đổi giá trị từ UTC sang bất kỳ múi giờ nào mà anh ta muốn mà không gặp bất kỳ vấn đề gì. Nhưng OP nói về việc nhận và hiển thị ngày tháng từ máy chủ, vì vậy tôi nghĩ ứng dụng của anh ấy chỉ hoạt động ở các múi giờ khác nhau. –

-2

Tôi nhận ra câu hỏi là cho C#, nhưng nếu tất cả các bạn muốn làm là một chuyển đổi duy nhất bạn có thể làm điều này từ dòng lệnh PowerShell:

$d = [DateTime]::Parse("04/02/2014 17:00:00") 
$gmt = [TimeZoneInfo]::FindSystemTimeZoneById("GMT Standard Time"); 
[TimeZoneInfo]::ConvertTime($d, $gmt, [TimeZoneInfo]::Local) 

Kịch bản này sẽ chuyển đổi 17:00 thời gian ở Anh vào múi giờ địa phương của bạn. Đối với tôi, đó sẽ là CST. Thật thú vị khi lưu ý rằng nếu tôi đã đặt ngày thành 27/03/2014, kết quả sẽ khác vì thời gian tiết kiệm ánh sáng ban ngày ở Vương quốc Anh bắt đầu vào những ngày khác nhau mà Hoa Kỳ.

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