检测和求和年、月和日

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 一年。 .谢谢 你能解释一下你是如何从年/月/日文本输入到这个函数中的单个“长度”参数的吗?我认为你最好不要有文本条目,而是将参数设置为数字。如果有人输入“一个”怎么办?它会中断,并给出一个模糊的错误。

以上是关于检测和求和年、月和日的主要内容,如果未能解决你的问题,请参考以下文章

C#中年,月和日参数的不可表示的DateTime

从python中的第周、月和日获取日期

输入一个天数和年,求月和日(有平年和闰年)

输入一个天数和年,求月和日(有平年和闰年)

如何使用 Oracle 以年、月和日为单位获取年龄

按月和日过滤 django 日期时间字段的问题