在VB中定义与年份无关的日期

时间:2014-11-16 23:41:12

标签: vb.net vba date

我正在尝试使用模块中的Access 2013为一个季节(夏天,冬天,车辙)定义日期戳。 “季节”在不同年份具有相同的开始和结束日期,定义如下。

11/15 to 3/5 = Winter
3/16 to 10/15 = Summer
10/16 to 11/14 = Rut

下面的函数首先处理空值,然后将日期时间戳格式化为一个简单的月份日(即11月15日格式化为11/15)。

然后我定义tmpSeason as a String并使用嵌套的If语句将每个日期范围分类到相应的季节。这就是问题所在。虽然代码运行,但它会生成一个包含所有“Winter”值的列。我怀疑这个错误源于使用> =或< =。

时缺少一年
Function Season(GPSFixTime)
   Dim tmpDt As Date

            If (IsNull(GPSFixTime) = True) Then
            Exit Function
            Else
            End If

        tmpDt = DateSerial(Mid(GPSFixTime, 1, 4), Val(Mid(GPSFixTime, 6, 2)), Val(Mid(GPSFixTime, 9, 2)))
        tmpDt = tmpDt + ((tmpHr / 24) - 7 / 24) 'To correct the time to local time in winter
        tmpDt = Format(tmpDt, "mm/dd") ' Format to remove year

   Dim tmpSeason As String
             If (tmpDt >= 11 / 15 Or tmpDt <= 2 / 15) Then
              tmpSeason = "Winter"
             Else
             If (tmpDt >= 3 / 15 Or tmpDt <= 10 / 15) Then
              tmpSeason = "Summer"
               Else
             If (tmpDt > 10 / 15 Or tmpDt < 11 / 15) Then
              tmpSeason = "Rut"

            End If
            End If
            End If

Season = tmpSeason

End Function

任何有关如何将日期正确分类到季节的想法都将受到赞赏。

这是我关于VBA的最初帖子之一,我欢迎在撰写实用职位时提供反馈。

2 个答案:

答案 0 :(得分:1)

您的格式化字符串错误,您应该使用MM作为月份组件,mm将使用分钟组件:

tmpDt = Format(tmpDt, "MM/dd")

在您的比较中,您试图将字符串与表达式进行比较,该表达式与字符串中的字符串类似,但实际上完全不同。

例如,11 / 15表达式并不表示日期,它将作为除法进行评估,结果为0.733333333333333。所以,您要将日期字符串与数字进行比较。

由于您已经以与字符串相当的方式格式化日期,您可以将日期字符串与代表季节边界的字符串进行比较:

If tmpDt >= "11/15" Or tmpDt <= "03/05" Then
  tmpSeason = "Winter"
ElseIf tmpDt >= "03/16" And tmpDt <= "10/15" Then
  tmpSeason = "Summer"
ElseIf tmpDt >= "10/16" And tmpDt <= "11/14" Then
  tmpSeason = "Rut"
End If

请注意,您应该使用And运算符来检查范围的两个边界,并使用Or作为冬季条件,实际上是两个单独的范围,只有一个上限和一个对方的下限。

您的日期从03/06到03/15有差距,我不知道这是否是故意的。如果错误,您可以调整代码以使用正确的日期,如果正确,您可能需要选择其他字符串以便在此期间显示。

答案 1 :(得分:0)

你有(至少)两个选择:要么用当前年份来建立季节的边界,要么做相反的事情 - 找到当前日期的一年中的一天以及一年中的一天季节边界并比较那些。