【问题标题】:Check if timeofday is in a specified range检查 timeofday 是否在指定范围内
【发布时间】:2016-11-12 14:01:01
【问题描述】:
    Dim time As String = TimeOfDay.ToString("tt")
    Dim time2 As Integer = TimeOfDay.ToString("hh:mm:ss")
    If time = ("du.") Then
        timehre = (time2 + 12)
        Debug.WriteLine("munkaidoben")
    Else
        Debug.Write("munkaidoben = false")
        timehre = time
    End If

    For munkaido As Integer = 13 To 19

        If time2.ToString.Contains(munkaido) Then
            duplaar = False
        Else
            duplaar = True
        End If
    Next

Timehre 已经被声明为整数。所以,我想要什么,以 utc +1 获取时间,如果时间在 13:00 - 19:00 范围内,则返回一个真正的布尔值,如果不是在 13:00 - 19:00 范围内,然后返回一个 false 布尔值。

附:抱歉英语不好,我希望你能理解我的问题。

【问题讨论】:

  • 我搜索某个字符串,因为我不知道如何将 timeofday 转换为 utc +1 time。

标签: .net vb.net boolean timeofday


【解决方案1】:

首先,开启Option Strict

Dim time2 As Integer = TimeOfDay.ToString("hh:mm:ss")
...
For munkaido As Integer = 13 To 19
    If time2.ToString.Contains(munkaido) Then

这是一个很好的例子,说明为什么不使用Option Strict 对于其他玩具程序来说是一个非常糟糕的主意。如果时间是“10:45:23”,time2 中的结果将是49!那个是从哪里来的?它是字符串中第一个字符的ASCII value

稍后,代码将测试文本 "49" 是否包含 13 - 19,这永远不会是真的。随着发生的转换,time2 只能介于"48""57" 之间。从语法上讲,它是无效的,因为字符串永远不能包含整数。

不使用Option Strict 可能会导致此类不需要的转换和错误。不要让编译器猜测您的意思:
工具 -> 选项 -> 项目和解决方案 -> VB 默认值 -> Option Strict On


您的代码并没有真正测试时间是否在一个范围内,只是测试 13-19 是否出现在字符串中的某个位置。如果分钟或秒是这些值之一,它将验证。

不要使用字符串进行DateTime 操作。 DateTime 类型拥有一整套可供您使用的属性:

Dim dt = DateTime.Now

If dt.Hour >= 13 AndAlso (dt.Hour <= 18 OrElse
                         (dt.Hour = 19 AndAlso dt.Minute = 0)) Then
    Return True
Else
    Return False
End If

代码测试 时间 是否在 13:00 和 19:00 之间,而不仅仅是小时,以便检测 是 19:01 或 19:59 19 小时但分钟放在 19:00 之后,检查小时和分钟。

我不确定 UTC 是如何发挥作用的,但使用 DateTime 方法也很容易:

Dim dt = DateTime.Now.ToUniversalTime()

增加一个小时:

Dim dt = DateTime.Now.ToUniversalTime.AddHours(1)

【讨论】:

  • DateTime.Hour 属性返回一个整数。它计算自午夜以来的小时数并向下舍入到最接近的整数。因此,如果时间是晚上 7.30,DateTime.Now.Hour 将返回 19,并且发布的函数将返回 True。但是,晚上 7.30 不在 13 到 19 小时范围内,因此它应该返回 False。为了判断时间是否在某个小时范围内,需要将自午夜开始的小时数计算为 Double。
【解决方案2】:

我最近必须实现类似的目标。这就是我想出的。

Public Function GetHoursSinceMidnight(ByVal dDateTime As DateTime) As Double
    Dim myTimeSpan As TimeSpan = dDateTime - dDateTime.Date
    Return myTimeSpan.TotalHours
End Function

Public Function IsTimeInRange(ByVal dDateTime As DateTime, ByVal dStartTime As Double, ByVal dEndTime As Double) As Boolean
    Dim dTime As Double = GetHoursSinceMidnight(dDateTime)
    Return dTime >= dStartTime AndAlso dTime <= dEndTime
End Function

所以要检查当前时间是否在世界标准时间下午 1 点和晚上 7 点之间加上一小时,请致电:

IsTimeInRange(DateTime.Now.ToUniversalTime.AddHours(1), 13, 19)

如果当前时间在下午 1 点到晚上 7 点之间,则返回 True,如果超出范围,则返回 False。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-07-13
    • 2022-11-15
    • 1970-01-01
    • 2021-03-30
    • 2016-05-03
    相关资源
    最近更新 更多