Jim*_*eth 29 delphi const date operator-overloading tdatetime
据我所知,没有办法做到这一点,但我会问,以防其他人知道如何做到这一点.如何在Delphi中将日期声明为const?
我发现的唯一解决方案是使用数字等价物,这是一种难以维护,因为它不是人类可读的.
const
Expire : TDateTime = 39895; // Is actually 3/23/2009
Run Code Online (Sandbox Code Playgroud)
我希望能做的是这样的:
const
Expire : TDateTime = TDateTime ('3/23/2009');
Run Code Online (Sandbox Code Playgroud)
要么
const
Expire : TDateTime = StrToDate('3/23/2009');
Run Code Online (Sandbox Code Playgroud)
所以让我知道这是一个功能请求,还是我错过了如何做到这一点(是的,我知道这似乎是一件奇怪的事情......)
Wou*_*ick 22
好吧,我的反应有点晚了,但这是新款Delphi的解决方案.
它使用隐式类重载程序,以便可以使用此类型的记录,就好像它们是TDateTime变量一样.
TDateRec = record
year,month,day,hour,minute,second,millisecond:word;
class operator implicit(aDateRec:TDateRec):TDateTime;
class operator implicit(aDateTime:TDateTime):TDateRec; // not needed
class operator implicit(aDateRec:TDateRec):String; // not needed
class operator implicit(aDateRec:String):TDateRec; // not needed
end;
Run Code Online (Sandbox Code Playgroud)
执行:
uses DateUtils;
class operator TDateRec.Implicit(aDateRec:TDateRec):TDateTime;
begin
with aDateRec do // Yeah that's right you wankers. I like "with" :)
Result := encodeDateTime(Year,Month,Day,Hour,Minute,Second,Millisecond);
end;
class operator TDateRec.Implicit(aDateTime:TDateTime):TDateRec;
begin
with Result do
DecodeDateTime(aDateTime,Year,Month,Day,Hour,Minute,Second,Millisecond);
end;
class operator TDateRec.Implicit(aDateRec:TDateRec):String;
begin
Result := DateTimeToStr(aDateRec)
end;
class operator TDateRec.Implicit(aDateRec:String):TDateRec;
begin
Result := StrToDateTime(aDateRec)
end;
Run Code Online (Sandbox Code Playgroud)
现在您可以声明这样的日期:
const
Date1:TDateRec=(Year:2009;month:05;day:11);
Date2:TDateRec=(Year:2009;month:05;day:11;hour:05);
Date3:TDateRec=(Year:2009;month:05;day:11;hour:05;minute:00);
Run Code Online (Sandbox Code Playgroud)
要查看它是否有效,请执行以下操作:
ShowMessage(Date1); // it can act like a string
ShowMessage(DateToStr(Date1)); // it can act like a date
Run Code Online (Sandbox Code Playgroud)
如果你真的想用这个替换所有的TdateTime变量,你可能还需要重载其他一些运算符(加,减,显式,......).
The*_*Fox 12
唯一的?可能的方式,但可能不是你想要的:
const
{$J+}
Expire: TDateTime = 0;
{$J-}
initialization
Expire := EncodeDate(2009, 3, 23);
Run Code Online (Sandbox Code Playgroud)
Dis*_*ned 11
我倾向于使用函数模拟const日期.从技术上讲,它们比"伪常量"可分配类型const更加稳定.
function Expire: TDateTime;
begin
Result := EncodeDate(2009, 3, 23);
end;
Run Code Online (Sandbox Code Playgroud)
注意使用EncodeDate而不是StrToDate.StrToDate受区域设置的影响意味着无法保证字符串将被解释为预期的.
例如,您是否知道有一群人认为将日期部分"混乱"为不一致的重要性顺序是有意义的?他们使用中间,然后最少,然后最重要的部分(例如'3/23/2009')<厚颜无耻的笑脸>.逻辑有意义的唯一时间是当你年满102岁 - 然后你可以宣称你的年龄是021.
对于那里的过早优化器,如果频繁调用函数使得编码日期所需的纳秒时间成为一个问题 - 那么在可读,可维护的代码名称中,这个问题要比这个次要的低效率大得多.
没有办法这样做,因为解释日期本身不是确定性的,它取决于您遵循的约定/语言环境.
例如,对于任何法国人来说,'1/4/2009'不是在1月份,并且将编译器翻译为1月4日将使其成为傻瓜的编译器;-)
除非编译器实现了一些(记录良好的)"魔术"双射函数配对日期值和显示表示......无论如何,地球的一半不喜欢它.
我现在看到的唯一不模糊的方式就是提供价值,即使它看起来很痛苦......我的0.02美元