2009-07-21 758 views
6

我正在使用C#3.5將小型MSAccess應用程序轉換爲基於Web的ASP.NET應用程序。我想知道在將某些VBA代碼轉換爲C#時,處理C#中日期的最佳方式是什麼。在C#中,如何將TimeSpan數據類型轉換爲DateTime?

下面是VBA代碼的例子:

Coverage1=IIf(IsNull([EffDate1]),0,IIf([CurrDate]<=[EndDate1],[CurrDate]-[EffDate1],[EndDate1]-[EffDate1]+1)) 

這裏是我當前的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 
      } 
     } 
    } 

回答

2

它看起來像你的VB實際上返回一個時間跨度,大概是幾天。這裏是最接近的直接翻譯:

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

相反,如果你只是想天的計數,只返回時間跨度的天屬性:

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

和良好的措施,這是我會怎麼收拾你最終版本:

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; 
} 
2

獲取時間跨度,然後從DateTime中減去以獲得所需的日期。對於你內心的IF語句,它應該是這樣的:

TimeSpan estSpan = dateCurrentDate.Subtract(dateEffDateOne); 
return dateCurrentDate.Subtract(estSpan); 

編輯:您可能還需要返回DateTime.MaxValue並有最大值調用功能檢查,而不是返回null。

+0

您的代碼將總是返回dateEffDateOne作爲結果,而不是日期之間的差異。 我想,這不是@ program247365想要的。 – VladV 2009-07-21 21:42:15

+0

我不相信這是OP要求的。他需要DateTime,但是如果他需要存儲時間段,那麼他應該使用TimeSpan。 – 2009-07-21 21:46:26

6

不能轉換爲null爲System.DateTime,因爲它是一個非空值類型」錯誤

DateTime類型是值類型,這意味着它不能持有空值。要獲得在這附近,您可以執行以下兩項操作之一;要麼返回DateTime.MinValue,要測試該值,或者更改函數返回DateTime?(注意問號),該值可以爲空DateTime。可以爲空的日期可以是像這樣使用:

DateTime? nullable = DateTime.Now; 
if (nullable.HasValue) 
{ 
    // do something with nullable.Value 
} 

不能隱式轉換system.timepsan爲System.DateTime

當你減去從另一個DateTime一個DateTime,結果是TimeSpan,代表它們之間的時間量。 TimeSpan並不代表特定的時間點,而是跨度本身。爲了獲取日期,可以使用接受TimeSpanDateTime對象的Add方法或Subtract方法超載。具體如何看起來我不能說,因爲我不知道你的代碼中的不同日期代表了什麼。

在最後一種情況下,你可以簡單地使用來自AddDays方法的返回值,但負值(以扣除,而不是增加一個某一天,):

return dateEffDateOne.AddDays(-1); 
+0

> dateCurrentDate.Subtract(dateCurrentDate.Subtract(dateEffDateOne)) dateCurrentDate-(dateCurrentDate-dateEffDateOne)== dateEffDateOne 我想,這是不是有什麼@ program247365希望。 – VladV 2009-07-21 21:47:54

+0

@VladV:我認爲你是對的。由於我不知道原始代碼示例中的各個日期如何相互關聯,因此我無法弄清楚預期的結果,因此從我的答案中刪除了該行。 – 2009-07-21 22:19:58

1

日期時間是value type。所以,你不能將null分配給DateTime。 但是,您可以使用一個特殊的值,如DateTime.MinValue來指示您試圖通過null指示的任何值。

DateTime代表日期(和時間),如「2009年7月22日」。這意味着,您不應該使用此類型來表示時間間隔,如「9天」。 TimeSpan是爲此設計的類型。

dateCurrentDate.Subtract(dateEffDateOne)(或,等價地,dateCurrentDate-dateEffDateOne)是兩個日期之間的差,即,時間間隔。所以,我建議你將函數的返回類型改爲TimeSpan。

TimeSpan也是一個值類型,因此您可以使用TimeSpan.Zero而不是null。

0

一些優秀的答案後(我上投你們),我終於敲定了什麼,我覺得是我的答案。事實證明,在這種情況下,返回一個整數,就像天數一樣。

謝謝大家,提供您真棒的答案。它幫助我走上了正確的軌道。

public int CalculateCoverageOne(DateTime dateCurrentDate, DateTime dateEffectiveDate, DateTime dateEffDateOne, DateTime dateEndDateOne) 
    { 
     //Coverage1= 
     //IIf(IsNull([EffDate1]),0, 
      //IIf([CurrDate]<=[EndDate1], 
       //[CurrDate]-[EffDate1], 
        //[EndDate1]-[EffDate1]+1)) 

     if (dateEffDateOne.Equals(TimeSpan.Zero)) 
     { 
      return (TimeSpan.Zero).Days; 
     } 
     else 
     { 
      if (dateEffectiveDate <= dateEndDateOne) 
      { 
       return (dateCurrentDate - dateEffDateOne).Days; 
      } 
      else 
      { 
       return (dateEndDateOne - dateEffDateOne).Add(new TimeSpan(1, 0, 0, 0)).Days; 
      } 
     } 
    } 
相關問題