如何在C#中模拟Delphi 2007 SecondsBetween函数?

NoP*_*God 2 c# delphi datetime delphi-2007

这是对前一个问题的跟进: C#与Delphi中的日期/时间计算之间的差异

我正在将用Delphi编写的企业应用程序移植到C#.该应用程序使用非常基本的加密形式来存储它生成的文本文件.此加密基于Delphi SecondsBetween命令,该命令返回两个日期之间的秒数.

对我来说问题是,在旧版本的Delphi(我正在移植的版本)中,SecondsBetween命令存在一个错误,导致它返回一个关闭的值 - 但只有大约50%的时间

这个bug是一个舍入错误.Delphi最初使用的是Trunc而不是Round.在此处查看更多详细信息 - http://qc.embarcadero.com/wc/qcmain.aspx?d=59310

以下是演示此问题的代码:

德尔福:

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

130289133
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想要做的是弄清楚如何在C#中模拟这种错误的行为,以便我可以读/写Delphi应用程序编写的文本文件.

RRU*_*RUZ 5

这是所需函数(SpanOfNowAndThen,SecondSpan)的翻译,以复制Delphi 2007 SecondsBetween函数.

using System;
using System.Text;

namespace D2007SecondsBetween
{
    class Program
    {
      const double HoursPerDay   = 24;
      const double MinsPerHour   = 60;
      const double SecsPerMin    = 60;
      const double MSecsPerSec   = 1000;
      const double MinsPerDay    = HoursPerDay * MinsPerHour;
      const double SecsPerDay    = MinsPerDay * SecsPerMin;

        static double SpanOfNowAndThen(Double ANow, Double AThen)
        {
          if (ANow < AThen)
            return AThen - ANow;
          else
            return ANow - AThen;
        }


        static double SecondSpan(Double ANow, Double AThen)
        {
         return  SecsPerDay * SpanOfNowAndThen(ANow, AThen);
        }

        static int SecondsBetween(DateTime ANow, DateTime AThen)
        {
          return (int)Math.Truncate(SecondSpan(ANow.ToOADate(), AThen.ToOADate()));
        }

        static void Main(string[] args)
        {
            TimeSpan span ;            
            span = DateTime.Parse("16/02/2009 23:25:34").Subtract(DateTime.Parse("1/01/2005 00:00:00"));
            Console.WriteLine(span.TotalSeconds);//returns 130289134
            Console.WriteLine(SecondsBetween(DateTime.Parse("16/02/2009 23:25:34"), DateTime.Parse("1/01/2005 00:00:00")));//returns 130289133

            span = DateTime.Parse("16/11/2011 23:25:43").Subtract(DateTime.Parse("1/01/2005 00:00:00"));
            Console.WriteLine(span.TotalSeconds);//returns 216948343
            Console.WriteLine(SecondsBetween(DateTime.Parse("16/11/2011 23:25:43"), DateTime.Parse("1/01/2005 00:00:00")));//returns 216948343

            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)