我想在TDateTime
变量中添加秒数,以便结果是在整分钟的开头。例如,如果现在是08:30:25,我想改变TDateTime
变量以存储08:31:00。
我发现TDateTime
有一个Decode函数,我可以使用它。但是,并没有encode函数将修改后的时间放回TDateTime变量中。
我想在TDateTime
变量中添加秒数,以便结果是在整分钟的开头。例如,如果现在是08:30:25,我想改变TDateTime
变量以存储08:31:00。
我发现TDateTime
有一个Decode函数,我可以使用它。但是,并没有encode函数将修改后的时间放回TDateTime变量中。
使用 DateUtils
,可以像这样做:
Uses
DateUtils;
var
Seconds : Word;
Seconds := SecondOfTheMinute(MyTime); // Seconds from last whole minute
// Seconds := SecondOf(MyTime); is equivalent to SecondOfTheMinute()
if (Seconds > 0) then
MyTime := IncSecond(MyTime,60 - Seconds);
Recode*
例程和EncodeDateTime
函数。这个单元在Delphi 2010中已经可用,可能甚至在更早的版本中也可用。TDateTime
数据类型表示自1899年12月30日以来的天数,作为实数。也就是说,TDateTime
的整数部分是整个天数的数量,小数部分表示一天中的时间。
因此,您可以使用简单的算术运算来解决问题:
var
Days: TDateTime;
Mins: Extended; { widen TDateTime's mantissa by 11 bits to accommodate division error }
begin
Days := Date + StrToTime('08:30:25');
Writeln(DateTimeToStr(Days));
Mins := Days * 24 * 60 ; // compute minutes
Mins := Math.Ceil(Mins); // round them up
Days := Mins / (24 * 60); // and back to days
{ or as simple and concise expression as: }
// Days := Ceil(Days * MinsPerDay) / MinsPerDay;
Writeln(DateTimeToStr(Days));
N/1440
的数字非常少是精确可表示的吗?你如何解释我给你发送的pastebin的行为?还是说,当你和我意见不合时,这是一种信仰,即我总是错的?即使证据表明相反? - David HeffernanMath.Ceil(dt1*24*60 - 0.25) / (24*60)
。这个方法可以适用到大约6000年左右。那时我们可能还在争论。 - David Heffernan
TDateTime
不是一个类或记录,因此你不能拥有它的“实例”。TDateTime
只是一种类型,实际上是一个Double
。 - Ken WhiteTDateTime
的问题之一是它们是双精度浮点数,其中小数部分是一天中的时间。这意味着某些分钟无法表示为精确数字。因此,新的DateUtils
库在进行计算之前总是将小数部分转换为包含从午夜开始的毫秒数的整数64。因此,使用库函数比在TDateTime
上进行显式计算更安全。请参见如何解决 Delphi 无法准确处理日期时间操作的问题?
。 - LU RDTDateTime
上进行任何数学运算都是一种实现泄漏
,因为使用TDateTime
不应该利用它被实现为Double
的事实。我同意使用DateUtils
和SysUtils
是一个更好的选择。虽然曾经有一段时间DateUtils
非常有缺陷,许多人实现了自己的TDateTime
工具。 - LU RD