簡體   English   中英

查找離今天最近的經常性日期 - C#

[英]Find recurring date nearest to today - C#

聽起來像是作業? 不,這不對。 我為此制定了邏輯,但是當日期跨越多年時,我並沒有這樣的表現。 基本上這是它應該如何工作,

StartDate: 1/1/2012

FinishDate: 1/10/2012 

RecurringInterval: 2 ( In days)

輸出將是:

1/6/2012月6日如果今天的日期( Date.Now )是1/5/2012 (假設格式為MM/dd/yyyy )。 達到完成日期后,檢查將結束。 如果在給定時間段內沒有匹配日期,則必須返回今天的日期。 死簡單但不高效。

這有什么問題?

if (!_isRecurring)
    return DateTime.UtcNow;
DateTime initialDate = _startDate;
DateTime finalDate = _finishDate;
int recurringDays = _recurringInteral;
/*
 * start Date + recurring interval falls between start date and finishdate then get its date
 */
do
{
    //add recurring day to start date
    initialDate = initialDate.AddDays(recurringDays);
    //check if it falls in between start days and end days
     if(initialDate  <= finalDate)
    break;            
} while (initialDate <= finalDate);
//return the first occurance of the recurring day
return initialDate;

一個小算術應該節省一天(雙關語):

var start = new DateTime(2012, 1, 1);
var end = new DateTime(2012, 10, 1);
var interval = 2; // days

var today = DateTime.Today;
var diff = (int)((today - start).TotalDays);
var mod = diff % interval;
var correction = TimeSpan.FromDays((mod > interval / 2 ? interval : 0) - mod);
var result = today + correction > end ? today : today + correction;
Console.Out.WriteLine("Result is: {0}", result);

看到它在行動

這樣做是計算今天距離“復發點”多少天(變量mod )。 這顯然是一個數字> = 0和<interval。 如果它是間隔的一半或更小,則意味着最接近的復發點早於今天,在這種情況下從今天減去mod天數以找到該點。 如果它大於間隔的一半,則意味着我們需要添加interval - mod天來找到該點(將來會是這樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM