日期和时间之间的分钟差异

5
有没有办法显示两个不同时间之间的差异。我目前有两个按钮。
Sub AddButtonClick(sender As Object, e As EventArgs)

    StartTime.Text = DateTime.Now.ToString()

End Sub

这会生成第一个时间戳

Sub EndBreakClick(sender As Object, e As EventArgs)

    EndTime.Text = DateTime.Now.ToString()

    DateDiff(DateInterval.Minute, Endtime, StartTime)
End Sub

这会生成第二个时间戳,但是datediff行会导致在我按下按钮时应用程序崩溃。

3个回答

10

您可以依赖 TimeSpan:

Dim elapsedTime As TimeSpan = DateTime.Parse(EndTime.Text).Subtract(DateTime.Parse(StartTime.Text))

它表现得像一个普通的时间变量,您可以从中提取所需的所有信息。例如:

Dim elapsedMinutesText As String = elapsedTime.Minutes.ToString()
请记住,上面的代码将字符串变量作为输入(来自文本框中的文本),因为它执行相应的转换:Convert.ToDateTime
关于您的代码,它涉及EndTimeStartTime,它们不是DateTime变量,而是TextBoxes。您必须将它们(它们的文本)转换为DateTime,就像我上面所做的那样:
DateDiff(DateInterval.Minute, DateTime.Parse(EndTime.Text), DateTime.Parse(StartTime.Text))

1
这样做可以工作,但是如果其中一个TextBox的值不包含有效的DateTime,则会引发异常。您可能希望捕获该异常,或者改用DateTime.TryParse以避免抛出异常。 - Douglas Barbin
@DouglasBarbin 很好的观点,我已经更新了我的答案。我总是依赖于Convert.ToDateTime,因为我确信到达那里的文本是一个正确的日期(否则计算无论如何都会出错);但对于一般目的和这个特定的OP,他不太熟悉VB.NET,我想这是一个更好的解决方案。 - varocarbas
TryParse实际上返回一个布尔值(如果解析成功则为true,如果失败则为false)。因此,您可能希望将其放在条件语句中,并在TryParse失败时将变量设置为null。然后,您可以根据需要检查变量的有效性。请参见我的答案以了解一般思路的实现。 - Douglas Barbin
@DouglasBarbin 不要误解我的意思,try...catch语句必须存在,但你不能以它们为基础编写代码。它们是最后的选择,只是为了确保万无一失的备选方案。我不喜欢默认依赖它们作为代码的正常流程,来设置条件或避免对输入值进行适当的分析。我并不打算说服你这是更好的编程方法,所以也不要试图说服我相反的观点(这在另一方面是相当不可能发生的 :))。 - varocarbas
@DouglasBarbin 上面的代码是用C#编写的,但是...我想它很容易理解(在行内编写C#比VB.NET更容易)。基本思路非常简单:如果您不在每个单独的条件中放置try catch,为什么在将文本转换为日期时要这样做?高风险情况可能在try catch中(如文本到日期转换),但这是一回事,完全不同的故事是让错误捕获成为转换过程的定义部分。好吧...我希望这次我的观点完全清楚。 - varocarbas
显示剩余7条评论

0

DateDiff 函数可以实现此功能。

label1.text = DateDiff("n", DateTime.Parse(EndTime.Text), DateTime.Parse(StartTime.Text)).ToString

如果您的应用程序崩溃了,您是否检查了要传递给它的变量?看起来您正在尝试将textbox传递给它,而不是textbox.text

就像我在另一个答案中评论的那样,我通常更喜欢使用TryParse而不是Parse,因为没有抛出异常的机会。通过正常的代码执行处理解析失败只是感觉更加“干净”,而不是捕获异常。 - Douglas Barbin
我也是,我主要是指出他们在参数中使用的明显类型错误。在他们的示例中,解析将是正确的,因为一个日期对象填充了它。 - OneFineDay

0
Sub EndBreakClick(sender As Object, e As EventArgs)

    EndTime.Text = DateTime.Now.ToString()

    Dim myStartTime As DateTime? = If(DateTime.TryParse(StartTime.Text, myStartTime), myStartTime, Nothing)
    Dim myEndTime As DateTime? = If(DateTime.TryParse(EndTime.Text, myEndTime), myEndTime, Nothing)
    If myStartTime.HasValue AndAlso myEndTime.HasValue Then
        Dim someVariable As Long = DateDiff(DateInterval.Minute, myStartTime.Value, myEndTime.Value)
        ' DO SOMETHING WITH THAT VARIABLE HERE
    Else
        ' One or both of the textbox values wasn't a valid DateTime.  Display an error message or something
    End If
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接