检测和求和年、月和日
Posted
技术标签:
【中文标题】检测和求和年、月和日【英文标题】:detect and Sum Year,Months and Days 【发布时间】:2012-11-05 22:07:00 【问题描述】:我的代码在下面可以正常工作,可以显示为年、月和日。因此,如下所示,我将其总结为仅显示为天,我进行了一些转换。我在代码中遇到了一些小问题.我的年份显示 330 而不是 365。如果我输入 1 年,它应该显示 365,1 个月应该是 30..但是如果 34 天它应该显示为 34,而不是显示为 60 天。任何人都可以弄清楚它是怎么来的我在下面的代码中收到此错误。这是我在 s-s-rs 2008 报告属性中的代码
Public Function ILength(length As Integer ) As String
dim year As Integer=0
dim month As Integer=0
dim day As Integer=0
dim sum as integer
if(length =0)
Return String.Empty
end if
if length >= 366 then
year=cstr(Math.Floor (length/ 365.25))
length =(length Mod 365.25)
length =(year * 365)
year =cstr(length)
end if
if length>31 Andalso length<366 then
month=cstr (Math.Floor(length/30.4375))
length=(length Mod 30.4375)
length=(month * 30)
month=cstr(length)
end if
if length<31 Then
day =cstr(length)
end if
if length = 0 then
Return String.Empty
end if
sum= ((year)+(month)+(day))
return(sum)
End Function
谢谢
【问题讨论】:
不清楚您期望什么输入和输出。请澄清这一点。 我会认真考虑使用 .Net 日期 (DateTime) 对象来完成此类工作。无需重新发明***。 @Meta-Knigh ..我期待如果我输入 1 年 2 个月和 3 天,我希望输出 428 天,因为 1 年等于 365,月 30 天和第 3 天,所以加起来应该显示 428 天 @BPete ..我有一个参数(s-s-rs 2008)来选择一个人落入的开始和结束日期的日期......这样一个人就可以正常工作...... 【参考方案1】:正如 B Pete 所说,您正在重新发明***。 Visual Basic 运行时库函数全部可用,并已被数千名开发人员测试和使用:
http://msdn.microsoft.com/en-us/library/c157t28f.aspx
例如日期差异
http://msdn.microsoft.com/en-us/library/t83eh0x7.aspx
【讨论】:
【参考方案2】:你的逻辑有一些问题。
-
首先,您根本不应该将任何内容转换为字符串 (CStr)。您可能需要在 s-s-rS 中执行此操作的唯一原因是显示工具提示或其他一些仅字符串字段。您当然不应该在对它们求和之前尝试这样做,尽管这无论如何都不会像您期望的那样起作用。
其次,您的函数采用的参数是“长度”,此代码假定为天数。然后,您将返回天数。该函数似乎没有其他目的,只是将天数拆分为年(365.25)和月(30)的设定值,然后重新组合以将这个标准化的年月长度相加。除了你似乎以粗略的方式加入了闰年。谁说 366 天就是一年?它可以是闰年,也可以是 1 年零 1 天。
您声明的变量都是整数,但您在数学中使用的是浮点数或小数。
您正在获取年份和月份的值,然后在不必要的步骤中用其他值覆盖它们。
假设您有充分的理由这样做(请分享!)并且不能使用简单的东西,例如:=datediff(d,fields!FirstDate.Value,fields!SecondDate.value)
那么我可以告诉你这个函数哪里出错了。
在这部分:
if length >= 366 then
year=cstr(Math.Floor (length/ 365.25))
length =(length Mod 365.25)
length =(year * 365)
year =cstr(length)
输入值 367。第二行将为您提供 year=1。第三行会给你长度=0。是的,零。您已将所有内容声明为整数,并且整数将隐式截断任何尾数(小数点后的位)。您想将这些声明为浮点或更好的精确数字。第四行用 Year(1) * 365 = 365 覆盖您的长度值。第五行然后将 365 转换为字符串并将其分配给 year,除了 year 是整数,因此它被隐式转换回整数。如果你的变量被声明为正确的类型,你只需要这 3 行,但同样 366 天的事情是非常农业的。它处理边缘情况很差。
if length >= 366 then
year=cstr(Math.Floor (length/ 365.25))
length =(length Mod 365.25)
下一部分:
if length>31 Andalso length<366 then
这也是不必要的。您已经在代码的第一部分确保长度现在小于 365(如果变量是正确的数据类型,那么长度将小于 365.25)
这就够了:
if length>31 then
你在下一部分做了同样的事情,前两行就足够了,再次假设你的数据类型是固定的。
month=cstr (Math.Floor(length/30.4375))
length=(length Mod 30.4375)
length=(month * 30)
month=cstr(length)
在下一部分中,它可以工作(除了 Cstr),但很不舒服。在测试长度是否
if length<31 Then
day =cstr(length)
end if
if length = 0 then
Return String.Empty
end if
您在 cmets 中说了两个相互矛盾的陈述。首先你有像年/月天这样的输入,其次你有开始和结束日期参数。如果第二个为真并且您有开始/结束日期,则丢弃此代码并使用 datediff。内置函数已考虑闰年和实际月份长度,无需使用粗略平均值。
您似乎为此使用了自定义代码,这是对不存在的问题的复杂解决方案。
【讨论】:
我在我的文本框中输入年份月份和日期...所以在我显示天数之前它显示为 1 年 2 个月和 6 天,运行良好。但现在我想转换成days 并添加 all.as 作为您的评论@Davos ..现在我输入月份和日期,当我运行我的 s-s-rs 2008 时,它会显示正确的输出。例如,在文本框中 5 天 = 5 天,然后在我的文本框中输入 2 个月,运行我得到了 60 天的 s-s-rs。我不在乎它的闰年,但根据要求,它应该显示为 30 天。唯一的问题是我无法正确显示年份,因为它显示 330 而不是 365 一年。 .谢谢 你能解释一下你是如何从年/月/日文本输入到这个函数中的单个“长度”参数的吗?我认为你最好不要有文本条目,而是将参数设置为数字。如果有人输入“一个”怎么办?它会中断,并给出一个模糊的错误。以上是关于检测和求和年、月和日的主要内容,如果未能解决你的问题,请参考以下文章