如何将ASP Classic日期差值计算转换为C#实现并获相同结果
在C#中复刻Classic ASP日期相减的结果
Classic ASP里日期直接相减返回的是总天数(包含小数部分,小数代表一天内的时间占比),要在C#里得到完全一致的结果,关键是把时间差转换成总天数的double值,下面是具体的解决步骤和代码:
问题分析
你在ASP里得到的14322.4290162037,其实是两个日期之间的总天数(含小数):整数部分是完整天数,小数部分是时分秒换算成一天的比例(比如10小时17分47秒 ≈ 0.4290162037天)。
正确的C#实现步骤
- 正确解析两个日期:
- 从DataRow中取出的
DATELASTUSE要转换成DateTime类型; - 解析基准日期
01/01/1980时,要注意格式字符串和区域文化,避免解析错误。
- 从DataRow中取出的
- 计算时间差并转换为总天数:
- 两个
DateTime相减得到TimeSpan,调用TotalDays属性就能得到和ASP完全一致的数值。
- 两个
完整代码示例
using System.Globalization; // 获取日期A:从DataRow转换为DateTime DateTime dateA = Convert.ToDateTime(dt.Rows[0]["DATELASTUSE"]); // 解析日期B:注意格式是dd/MM/yyyy,用InvariantCulture避免区域设置影响 DateTime dateB = DateTime.ParseExact("01/01/1980", "dd/MM/yyyy", CultureInfo.InvariantCulture); // 计算总天数(含小数,和Classic ASP结果一致) double daysDifference = (dateA - dateB).TotalDays; // 输出结果,应该等于14322.4290162037 Console.WriteLine(daysDifference);
你之前代码的问题点
- 格式字符串错误:你用了
"dd/MM/yy",但yy会把1980解析成2080,应该用"dd/MM/yyyy"来匹配4位年份; - 未使用TotalDays:直接相减得到的是
TimeSpan对象,不是数值,必须调用TotalDays才能得到总天数的double值; - 区域文化问题:最好指定
CultureInfo.InvariantCulture,避免不同系统的日期格式设置导致解析失败。
内容的提问来源于stack exchange,提问作者Hanz Cheah




