给定一个日期列表,我如何获得过去到今天最近的日期和将来最近的日期到今天的VB.NET

时间:2012-09-03 01:32:15

标签: vb.net date datetime timespan

我目前正在使用以下功能将日期列表中最近的日期返回到日期(今天)。我的问题是,该函数返回最接近的日期,无论它是今天的过去还是未来。如何更改此代码,以便有一个选项可以在今天之后和最近的日期之前返回最近的日期?这让我感到困惑。

非常感谢您的投入。

Function GetNearestDate(ByVal source As IEnumerable(Of DateTime), ByVal target As DateTime) As DateTime
    Dim result As DateTime = Nothing
    Dim lowestDifference = TimeSpan.MaxValue

    For Each _date As DateTime In source

        If _date >= target Then
            Continue For
        End If

        Dim difference = target - _date

        If difference < lowestDifference Then
            lowestDifference = difference
            result = _date
        End If
    Next

    Return result
End Function

2 个答案:

答案 0 :(得分:2)

似乎这就是你要找的东西。你只需要能够将某些内容传递给函数,以便它知道你想要什么。我选择了一个明确的枚举。我还更新了它以传回可以为空的日期。这应该可以纠正您的时间问题,但您需要考虑返回的空值。

Public Enum DateCompare
    LessThanEqualTo
    GreaterThanEqualTo
End Enum

Public Function GetNearestDate(ByVal source As IEnumerable(Of DateTime), _
                               ByVal target As DateTime, _
                               ByVal dt As DateCompare) As Nullable(Of DateTime)
    Dim result As Nullable(Of DateTime) = Nothing
    Dim lowestDifference As TimeSpan = TimeSpan.MaxValue
    Dim difference As TimeSpan

    For Each _date As DateTime In source
        If dt = DateCompare.LessThanEqualTo And _date > target Then
            Continue For
        ElseIf dt = DateCompare.GreaterThanEqualTo And _date < target Then
            Continue For
        End If

        If target > _date Then
            difference = target - _date
        Else
            difference = _date - target
        End If

        If difference < lowestDifference Then
            lowestDifference = difference
            result = _date
        End If
    Next

    Return result
End Function

答案 1 :(得分:1)

希望您能将此转换为VB.Net。我们的想法是对日期进行排序,然后找到给定日期的索引,然后集合中的上一个日期和下一个日期分别是过去和将来最接近的日期

之后找到最近的日期
string findNearestAfter(List<DateTime> ld, DateTime t)
{
    ld.Sort();

    int index = 0;
    for (int i = 0; i < ld.Count; i++ )
    {
        if (ld[i] == t)
            index = i;
    }

    string nearest = "";

    if (index < ld.Count)
        nearest = ld[index + 1].ToString();

    return nearest;
}

之前找到最近的日期
string findNearestBefore(List<DateTime> ld, DateTime t)
{
    ld.Sort();

    int index = 0;
    for (int i = 0; i < ld.Count; i++ )
    {
        if (ld[i] == t)
            index = i;
    }

    string nearest = "";

    if (index > 0)
        nearest = ld[index - 1].ToString();

    return nearest;
}

enter image description here

从上面的图片中选择任意日期,上一个和下一个是最近的日期。请注意日期已排序。例如,选择8月15日,那么最近的未来日期是21,最近的过去日期是12