因此,我正在制作一个程序,该程序将根据用户给出的时间跨度给出新的日期(例如 Windows 10/11 中内置计算器应用程序中的日期计算)。问题是,我只能设法添加年份,而日期和月份保持不变。
这是我的尝试:
Dim dateresult As String
Dim datenow As Date = Now.ToShortDateString
dateresult = datenow.AddDays(CBbDay.Text)
dateresult = datenow.AddMonths(CBbMonth.Text)
dateresult = datenow.AddYears(CBbYear.Text)
Label17.Text = dateresult
例如,如果今天的日期是 2024 年 1 月 1 日,并且 CBbDay、CBbMonth 和 CBbYear 的值为 10,则我从该代码 ( ) 中得到的结果dateresult
是 2034 年 1 月 1 日,而它应该是 2034 年 11 月 11 日。
我的代码有什么问题或者我使用了错误的函数吗?
谢谢。
问题是你继续使用原始值作为起点。您将天数添加到
datenow
,然后忽略该结果并将月份添加到datenow
,然后您忽略该结果并将年份添加到datenow
并且仅使用最后一个结果,所以当然您的结果只添加了年份。如果您实际上使用先前的结果作为起点,那么您最终将得到包含所有三个操作的最终结果。这:应该是这样的:
实际上,用一行代码来完成它会更有意义,在这种情况下,您本质上会使用之前的结果:
以下内容与具体问题无关,但我想提供代码,因此评论并不能真正解决问题。您确实需要停止如此快速和随意地处理数据类型。不要将日期和/或时间存储为
Strings
. .NET 为它们提供了专用的数据类型是有原因的。我希望您不要将数字转换为数字Strings
,然后尝试对它们进行算术运算,但一切皆有可能。您应该首先上交
Option Strict On
项目属性。如果您发布的内容代表您的代码,这将标记很多错误,因为它将要求您使用正确的数据类型并在需要时在它们之间显式转换/转换。您的代码应如下所示:Date.Today
将为您提供一个Date
包含今天日期和归零时间的值。只需以此为起点即可。不需要Date.Now
自己使用和删除时间,不需要变量,也不需要使用String
. 来自Strings
的ComboBoxes
被转换为Integer
值,这是这些方法所需要的。事实上,您依赖系统为您进行转换/转换。这通常会起作用,但有时会不起作用,直到应用程序崩溃,或者更糟糕的是,默默地保存错误数据时,您才会发现。该值仅在您实际需要 a 时(即显示数据时)Date
转换为 a 。String
String
你有一个名为 的控件也是非常可怕的
Label17
。想象一下有 17 个Labels
而不做任何事情来区分他们的目的。至少你ComboBoxes
有有意义的名字,即使它们有点狡猾。一切都应该有一个描述性的名称。当您回到之前编写的代码并且不知道它在做什么时,您就会明白为什么。我还应该注意,您实际上不需要将变量的声明和初始化分开:
如果你有
Option Infer On
,默认情况下,变量可以被推断为与其初始化表达式相同的类型,因此dateResult
将被推断为 typeDate
。