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应用程序编写的文本文件.
这是所需函数(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)
归档时间: |
|
查看次数: |
680 次 |
最近记录: |