2009-10-12 21 views
10

Tôi phải sử dụng một số ngày và giờ từ cơ sở dữ liệu cũ. Chúng được biểu diễn dưới dạng chuỗi. Ngày là dd/MM/yy. Thời gian là HH: mm.Thời gian chuyển đổi Vương quốc Anh (cả BST và GMT) được biểu thị dưới dạng chuỗi thành UTC (trong C#)

Tôi muốn chuyển đổi chúng thành UTC ngay khi tôi kéo chúng từ cơ sở dữ liệu. Tôi đang làm việc trên các hệ thống của Mỹ, vì vậy cần một thời gian chung.

Sự cố tôi đang gặp phải là cách chuyển đổi chúng thành giá trị UTC ngày giờ. Tôi có thể thực hiện phân tích cú pháp, v.v. Vấn đề thực sự tôi quan tâm đến múi giờ.

Tôi đang cố gắng sử dụng các phương pháp sau đây:

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.BaseUtcOffset); 

Tuy nhiên, điều này mang lại giá trị đúng nếu ngày là trong khoảng thời gian mùa hè của Anh.

Tôi có thể sử dụng "GMT Daylight Time" vào những ngày đó, nhưng điều đó đòi hỏi tôi phải biết khi nào chuyển đổi. Tôi chắc chắn phải có một cách ít tốn kém hơn.

Vì tôi không sử dụng máy có cài đặt thời gian ở Vương quốc Anh, tôi không thể dựa vào giờ địa phương.

Về cơ bản, tôi cần một cái gì đó như:

// Works for both GMT (UTC+0) and BST (UTC+1) regardless of the regional settings of the system it runs on. 
DateTime ParseUkTimeAsUtcTime(string date, string time) 
{ 
    ... 
} 

tôi đã lùng sục các bài viết, nhưng không thể tìm thấy bất cứ điều gì mà giải quyết này trực tiếp. Chắc chắn đây cũng là một vấn đề với EST, EDT, vv?

+0

Tôi cần điều này như một phương thức TimeInTimeZone-> TimeInUTC chung. –

Trả lời

5

Hãy thử sử dụng phương pháp GetUtcOffset() trên cá thể TimeZoneInfo của bạn, xem xét "quy tắc điều chỉnh".

Sử dụng tính năng này về cơ bản giống như ví dụ ban đầu của bạn, nhưng bạn sẽ sử dụng phương thức đó thay vì thuộc tính BaseUtcOffset.

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.GetUtcOffset(ukTime)); 
+0

Đẹp, nhưng bạn có thể đăng một mẫu mã cho người dốt nát không? Đây phải là một nguồn kinh điển. –

+0

Tôi nghĩ rằng ví dụ này nên bao gồm những gì bạn cần làm. Hãy cho tôi biết nếu bạn đã đơn giản hóa điều này. – bdukes

+0

Chỉ có điều tôi sẽ thêm vào điều này, là để có được một đối tượng DateTime thực tế tôi gọi là 'utcTime.UtcDateTime' –

0

Làm thế nào về:

DateTime.Parse(dateTimeString).ToUniversalTime(); 

Giả sử rằng các máy chủ cơ sở dữ liệu lưu trữ datetimes của nó trong múi giờ giống như máy chủ ứng dụng của bạn.

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