2011-12-16 29 views
11

Delphi:Chênh lệch giữa tính toán ngày/giờ trong C# so với Delphi

SecondsBetween(StrToDateTime('16/02/2009 11:25:34 p.m.'), StrToDateTime('1/01/2005 12:00:00 a.m.')); 

130289133 

C#:

TimeSpan span = DateTime.Parse("16/02/2009 11:25:34 p.m.").Subtract(DateTime.Parse("1/01/2005 12:00:00 a.m.")); 

130289134 

Nó không phù hợp một trong hai. Một số ngày sẽ thêm lên như nhau, tức là ..

TimeSpan span = DateTime.Parse("16/11/2011 11:25:43 p.m.").Subtract(DateTime.Parse("1/01/2005 12:00:00 a.m.")); 

SecondsBetween(StrToDateTime('16/11/2011 11:25:43 p.m.'), StrToDateTime('1/01/2005 12:00:00 a.m.')); 

both give 

216905143 

Tổng số tiền của giây là thực sự được sử dụng để mã hóa dữ liệu, và tôi đang cố gắng để cổng ứng dụng với C#, vì vậy ngay cả một giây hoàn toàn ném tất cả mọi thứ tắt.

Ai có thể giải thích sự khác biệt không? Và có cách nào để có được C# để phù hợp với delphi?

Chỉnh sửa: Để phản hồi các đề xuất có thể có liên quan đến bước nhảy vọt thứ hai: Cả hai phạm vi ngày có cùng số giây nhảy vọt (2), vì vậy bạn mong đợi không phù hợp cho cả hai. Nhưng thay vào đó, chúng tôi thấy sự không nhất quán

16/02/2009 - 1/01/2005 = Delphi and C# calculate a different total seconds 

16/11/2011 - 1/01/2005 = They calculate the same total seconds 
+0

Vấn đề thú vị nhưng bạn _should_ đặt câu hỏi. –

+0

Có lẽ hai hệ thống xử lý [giây nhảy vọt] (http://en.wikipedia.org/wiki/Leap_second) khác nhau? – dasblinkenlight

+0

@Austin Salonen Tôi đã thêm phần câu hỏi cho bạn: P – NoPyGod

Trả lời

7

Sự cố có vẻ như liên quan đến số này QC 59310, lỗi đã được khắc phục trong Delphi XE.

+1

Với điều này, làm cách nào để mô phỏng lỗi này trong C#? Tôi đang cố gắng chuyển một ứng dụng và nếu tôi là một phần thứ hai, nó sẽ ném toàn bộ phần giải mã của ứng dụng vào tình trạng lộn xộn. Cảm ơn bạn đã tìm kiếm thông tin này, rất hữu ích. – NoPyGod

+0

@NoPyGod Bạn không thể loại bỏ nó trong C#, bởi vì nó ở bên Delphi; bạn có thể giới thiệu lại nó ở đó, nhưng nó có thể là quá nhiều của một hack. Hãy thử sử dụng "ngày giữa" (giả sử có một phương thức như vậy), và sau đó tính toán sự khác biệt giữa hai ngày-ít lần theo cách thủ công. – dasblinkenlight

0

Một khả năng sẽ xử lý Leap Seconds. Tuy nhiên, .NET không xa như tôi biết.

+0

Cả hai phạm vi ngày có cùng số giây nhảy vọt, nhưng một trong số các phạm vi ngày đó được tính toán chính xác. – NoPyGod

+0

@NoPyGod, nếu một tài khoản cho giây nhảy vọt và cái kia thì không, nó sẽ dẫn đến sự khác biệt. –

+0

Tôi đã so sánh kết quả ở cả hai ngôn ngữ cho hai phạm vi ngày khác nhau. Trong một trường hợp kết quả phù hợp. Cả hai phạm vi ngày đều có cùng số giây nhuận. – NoPyGod

0

Bạn không đề cập đến cách bạn chuyển đổi C# TimeSpan thành một số. Thuộc tính TotalSeconds là một giá trị dấu chấm động - có lẽ đó là một vấn đề làm tròn trong phép chuyển đổi kép thành int?

+0

chỉ với một dàn diễn viên thường xuyên (int) – NoPyGod

+0

Giá trị dưới dạng gấp đôi vẫn không chính xác. Nhưng bạn hoàn toàn đúng, tôi không nên bỏ qua chi tiết đó. – NoPyGod

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