2014-09-08 12 views
5

cách chúng tôi có thể xác định số giờ đã trôi qua giữa hai lần. Ví dụ:Giờ trôi qua giữa hai lần, không phân biệt quốc gia và múi giờ

3:30 AM in San Francisco và 19:30 tại Dubai

Phần rằng tôi rõ ràng là, là có một cách phổ quát tính khoảng thời gian trừ, bằng cách lấy múi giờ và các nước trong tính toán.

Tôi đang sử dụng C# làm ngôn ngữ chính. Bất kỳ trợ giúp sẽ được đánh giá cao.

Xin cảm ơn trước.

+1

Bạn đang tìm định dạng UTC? – danish

+0

Kiểm tra [tại đây] (http://stackoverflow.com/questions/6930489/safely-comparing-local-and-universal-datetimes). – PTwr

Trả lời

4

Bạn hỏi về:

"3:30 chiều tại San Francisco và 7:30 tối tại Dubai"

Nếu tất cả những gì bạn biết là thời gian và vị trí, sau đó bạn có một vấn đề bởi vì không phải tất cả các múi giờ đều là các thực thể cố định. Dubai được sửa ở UTC + 4, nhưng San Francisco thay thế giữa UTC-8 cho Giờ chuẩn Thái Bình Dương và UTC-7 cho Giờ ban ngày Thái Bình Dương. Vì vậy, cần có ngày để thực hiện chuyển đổi này.

Sau đây sẽ cung cấp cho bạn sự khác biệt bằng cách sử dụng hiện ngày theo múi giờ đầu tiên:

TimeZoneInfo tz1 = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
TimeZoneInfo tz2 = TimeZoneInfo.FindSystemTimeZoneById("Arabian Standard Time"); 

DateTime today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz1).Date; 

DateTime dt1 = new DateTime(today.Year, today.Month, today.Day, 15, 30, 0); // 3:30 PM 
DateTime dt2 = new DateTime(today.Year, today.Month, today.Day, 19, 30, 0); // 7:30 PM 

TimeSpan elapsed = TimeZoneInfo.ConvertTimeToUtc(dt1, tz1) - 
        TimeZoneInfo.ConvertTimeToUtc(dt2, tz2); 

(Lưu ý rằng ID "Pacific Standard Time" là định danh múi giờ Windows cho khu Mỹ Thái Bình Dương, và mặc dù tên, bao gồm cả PST và PDT.)

Nhưng ngay cả điều này không nhất thiết phải là cách tiếp cận tốt nhất vì "hôm nay" không giống nhau ở mọi múi giờ. Tại (gần như) bất kỳ thời điểm nào, có hai ngày hoạt động khác nhau trên toàn thế giới. Hình minh họa này from Wikipedia thể hiện tốt điều này.

                                                        Date Animation

Có thể ngày "hiện tại" cho múi giờ nguồn là không phải cùng ngày hiện tại trong múi giờ kết thúc. Nếu không có đầu vào bổ sung, không có nhiều bạn có thể làm về điều đó. Bạn cần phải biết ngày được đề cập cho mỗi giá trị.

0

Cách đơn giản nhất là chuyển đổi cả hai đối tượng DateTime để UTC và sau đó trừ họ:

var utcSanFran = sfLocal.ToUniversalTime(); 
var utcDubai = dubaiLocal.ToUniversalTime(); 
var elapsed = dubaiLocal - sfLocal; 

Giả sử rằng Dubai> San Francisco.

Để có được tổng số giờ sử dụng đã trôi qua:

elapsed.TotalHours; 

Xin lưu ý rằng điều này sẽ dường như chỉ làm việc cho múi giờ của máy tính địa phương. Xem http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx để có cách tốt hơn để thực hiện việc này.

+0

Ummm ... không. Đây không phải là một giải pháp tốt. Khi bạn gọi 'ToUniversalTime', nó chỉ có thể chuyển đổi từ múi giờ địa phương của máy đang chạy. Vì một máy tính duy nhất không thể ở San Francisco và Dubai cùng một lúc, mã này sẽ không hoạt động bất kể nó đang chạy ở đâu. –

+0

Vâng, ít nhất bạn có thể làm là chỉ ra giải pháp đúng. http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx nên cung cấp tất cả thông tin OP cần. – t0yk4t

+0

Tôi chỉ có thể nhập quá nhanh. :) –

2

Nếu bạn sử dụng các loại DateTimeOffset bạn có thể tránh được một số những cạm bẫy của việc sử dụng thời gian địa phương vì nó có thể đại diện cho thời gian địa phương trong bất kỳ múi giờ:

var dateTimeOffsetSanFrancisco = DateTimeOffset.Parse("9/8/2014 3:30PM -0700"); 
var dateTimeOffsetDubai = DateTimeOffset.Parse("9/8/2014 7:30PM +0400"); 
var elapsedHours = (dateTimeOffsetDubai - dateTimeOffsetSanFrancisco).TotalHours; 
+1

Xin lưu ý rằng việc sử dụng. Giờ sẽ không phải lúc nào cũng trả lại số tiền chính xác: Số tiền này sẽ 'Cuộn qua' nhiều lần hơn một ngày (Tức là 25 giờ sẽ trả về 1). TotalHours sẽ cung cấp cho bạn tổng số giờ thực tế đã trôi qua. – t0yk4t

+0

@MelanieSchmidt: Rất tiếc, đó là một lỗi đánh máy ngốc nghếch. Đã sửa lỗi. Cảm ơn. –

+0

Vâng, đây cũng là một cách tiếp cận tốt - Khi bạn biết ngày và bù trừ trước. –

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