Date 计算两天tcl之间的天数

Date 计算两天tcl之间的天数,date,tcl,Date,Tcl,我正在计算两个日期之间的天数(两个日期以秒为单位)。下面给出了正确的结果,但给出了负值 例如-7.0。我不知道为什么 我还可以删除小数点并显示吗 set interval [expr { $start_date - $get_date }] set days [expr { floor($interval / (60*60*24)) }] puts "Start Date: $start_date <br>" puts

我正在计算两个日期之间的天数(两个日期以秒为单位)。下面给出了正确的结果,但给出了负值

例如-7.0。我不知道为什么

我还可以删除小数点并显示吗

        set interval [expr { $start_date - $get_date }]
        set days [expr { floor($interval / (60*60*24)) }]
        puts "Start Date: $start_date <br>"
        puts "Stop Date: $get_date <br>"
        puts "Total number of dates betwen 2 days: $days"
set interval[expr{$start\u date-$get\u date}]
设定天数[expr{floor($interval/(60*60*24))}]
放入“开始日期:$Start_Date
” 放置“停止日期:$get_Date
” 将“2天之间的日期总数:$days”
您正在从开始减去结束(假设这是
$get\u date
的值)。把它想象成数字,晚一点的日期是一个更大的数字——如果你从一个小数字中减去一个大数字,你会得到一个负值,对吗

因此,您可能只想反转算法:

set interval [expr { $get_date - $start_date }]
我不知道小数点的部分,恐怕。。。也许(基于)只是:

编辑:如评论中所述,在两个事件之间的“天数”方面需要谨慎。你是指过去的几天、每天24小时还是“本地”几天?您的输入值是本地时间、UTC还是其他格式?您是否可以使用专用的日期/时间库来处理此问题?(我不知道tcl是否有这样的产品,但我希望它有。)


你应该仔细考虑在什么情况下你到底想要什么行为,并相应地编写测试。

你是在从开始减去结束(假设这就是
$get\u date
的结果)。把它想象成数字,晚一点的日期是一个更大的数字——如果你从一个小数字中减去一个大数字,你会得到一个负值,对吗

因此,您可能只想反转算法:

set interval [expr { $get_date - $start_date }]
我不知道小数点的部分,恐怕。。。也许(基于)只是:

编辑:如评论中所述,在两个事件之间的“天数”方面需要谨慎。你是指过去的几天、每天24小时还是“本地”几天?您的输入值是本地时间、UTC还是其他格式?您是否可以使用专用的日期/时间库来处理此问题?(我不知道tcl是否有这样的产品,但我希望它有。)


你应该仔细考虑在什么情况下你想要什么样的行为,并相应地编写测试。

不是所有的日子都是86400秒长,因为像夏令时这样的小事情。因此,您需要在计算中进行一些舍入(并使用浮点除法):


在计算区间长度时,通常从终点减去起点,而不是相反。正确的标志。

不是所有的日子都有86400秒长,因为像夏令时这样的小事情。因此,您需要在计算中进行一些舍入(并使用浮点除法):


在计算区间长度时,通常从终点减去起点,而不是相反。符号正确。

在这种情况下,由于DST发生了变化,最好使用
舍入。
我太傻了。还有什么方法可以删除小数点吗?@DonalFellows:不一定。这取决于预期的结果。如果它只显示整天(但输入也可以包含时间),那么需要做更多的工作。如果两个值都是UTC,则无需更改。我将编辑答案以进一步解释这一点。我花了几天的时间来表示,嗯,几天。我还假设
$get\u date
$start\u date
是通过Tcl的
时钟扫描来提取的,该扫描应用于部分时间戳(仅使用日期部分);在这一点上,真正的问题是处理DST…@DonalFellows:这当然是可能的。很难说清楚——实际需求可能表明,这不是一个正确的开始方法。基本上,我认为我们没有足够的信息来确定,我也不想给人这样的印象,即仅仅使用
round
将始终给出所需的值。在日期/时间计算中有足够的微妙之处,以至于一个答案几乎不适用于所有问题:(在这种情况下,最好使用
round
,因为DST发生了变化。哇,我太傻了。我还有什么办法可以删除小数点吗?@DonalFellows:不一定。这取决于预期结果。如果它只显示整天(但输入也可以包含时间)然后需要做更多的工作。如果两个值都是UTC,则不需要更改。不过,我将编辑答案以进一步解释这一点。我花了几天的时间来表示天。我还假设
$get\u date
$start\u date
是通过对部分时间戳应用Tcl的
时钟扫描来提取的(仅包含日期部分);在这一点上,真正的问题是如何处理DST…@DonalFellows:这是可能的,当然。很难说清楚-实际需求可能表明这不是正确的开始方法。基本上,我认为我们没有足够的信息来确定,我不想给人一种仅仅使用
轮的印象
将始终给出所需的值。在日期/时间计算中有足够的微妙之处,一个答案几乎不适用于所有问题:(
set days [expr {round($interval / double(60*60*24))}]