在C#中,如何将TimeSpan数据类型转换为DateTime?

pro*_*365 7 .net c# vba type-conversion access-vba

我正在使用C#3.5将一个小型MSAccess应用程序转换为基于Web的ASP.NET应用程序.当我将一些VBA代码转换为C#时,我想知道在C#中处理日期的最佳方法是什么.

以下是VBA代码的示例:

Coverage1=IIf(IsNull([EffDate1]),0,IIf([CurrDate]<=[EndDate1],[CurrDate]-[EffDate1],[EndDate1]-[EffDate1]+1))
Run Code Online (Sandbox Code Playgroud)

以下是我当前的C#代码与注释代码中表示的错误相似:

    public DateTime CalculateCoverageOne(DateTime dateEffDateOne, DateTime dateCurrentDate, DateTime dateEndDateOne) 
    {
        if (dateCurrentDate.Date <= dateEndDateOne.Date)
        {
            return null; //Get "cannot convert null to System.DateTime because it is a non-nullable value type" error
        }
        else
        {
            if (dateCurrentDate.Date <= dateEndDateOne)
            {
                return dateCurrentDate.Subtract(dateEffDateOne);  //Gets error "cannot implicitly convert system.timepsan to system.datetime
            }
            else
            {
                return dateEndDateOne.Subtract(dateEffDateOne.AddDays(1)); //Gets error "cannot implicitly convert system.timepsan to system.datetime
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Fre*_*örk 7

无法将null转换为System.DateTime,因为它是一个不可为空的值类型"错误

DateTime类型是一个值类型,这意味着它不能保持一个空值.为了解决这个问题,你可以做两件事之一; DateTime.MinValue当你想要使用该值时返回并测试,或者更改要返回的功能DateTime?(注意问号),这是一个可空的DateTime.可以为空的日期可以像这样使用:

DateTime? nullable = DateTime.Now;
if (nullable.HasValue)
{
    // do something with nullable.Value
}
Run Code Online (Sandbox Code Playgroud)

无法将system.timepsan隐式转换为system.datetime

当您DateTime从另一个中减去a 时DateTime,结果为a TimeSpan,表示它们之间的时间量.它TimeSpan不代表特定的时间点,而是跨度本身.为了获取日期,您可以使用接受a 的对象的Add方法或Subtract方法重载.究竟应该怎么看我不能说,因为我不知道你的代码中的不同日期代表什么.DateTimeTimeSpan

在最后一种情况下,您可以简单地使用AddDays方法的返回值,但使用负值(为了减去一天,而不是添加一个):

return dateEffDateOne.AddDays(-1);
Run Code Online (Sandbox Code Playgroud)


dah*_*byk 3

看起来您的 VB 实际上返回了一个时间跨度,大概以天为单位。这是最接近的直接翻译:

public TimeSpan CalculateCoverageOne(DateTime EffDate1, DateTime CurrDate, DateTime? EndDate1)
{
    return (EndDate1 == null) ? TimeSpan.Zero :
           (CurrDate < EndDate1) ? (CurrDate - EffDate1) :
           (EndDate1.AddDays(1) - EffDate1);
}
Run Code Online (Sandbox Code Playgroud)

如果您只想要天数,只需返回 TimeSpan 的 Days 属性:

public int CalculateCoverageOne(DateTime EffDate1, DateTime CurrDate, DateTime? EndDate1)
{
    return ((EndDate1 == null) ? TimeSpan.Zero :
            (CurrDate < EndDate1) ? (CurrDate - EffDate1) :
            (EndDate1.AddDays(1) - EffDate1)).Days;
}
Run Code Online (Sandbox Code Playgroud)

为了更好地衡量,这就是我清理最终版本的方法:

public int CalculateCoverageOne(DateTime dateCurrentDate, DateTime dateEffectiveDate, DateTime dateEffDateOne, DateTime dateEndDateOne)
{
    TimeSpan ts;
    if (dateEffDateOne == DateTime.MinValue)
    {
        ts = TimeSpan.Zero;
    }
    else if (dateEffectiveDate <= dateEndDateOne)
    {
        ts = dateCurrentDate - dateEffDateOne;
    }
    else
    {
        ts = (dateEndDateOne - dateEffDateOne) + new TimeSpan(1, 0, 0, 0);
    }
    return ts.Days;
}
Run Code Online (Sandbox Code Playgroud)