Chr*_*ton 20 delphi firebird datetime calendar date
我需要存储由多个不同日历产生的日期和持续时间.特别是我需要存储以下日期:
我还需要存储我定义为两个时间戳(日期和时间)之间差异的持续时间.这意味着需要能够存储"零"日期 - 因此我可以存储持续时间,例如,三个半小时; 或10分钟.
我有所需计算的详细信息.Firebird的时间戳基于日期函数,该函数从公元100年1月1日开始,因此无法按照我需要记录它们的方式使用.此外,此数据类型已准备好(与大多数时间戳功能一样),以记录自基准日期以来的天数; 它不适合记录日历日期.
谁能建议:
编辑:
@Warren P在他的回答中提供了一些出色的工作.我显然没有完全解释我所寻求的内容,因为他的工作主要集中在计算以及如何计算这些计算上.所有有价值和有用的东西,但不是我打算传达的问题.
我确实知道了在日期的各种表示之间进行转换所需的所有计算,并且我对如何实现它们有相当好的想法(使用Warren建议的元素).但是,我的要求是存储符合上面列出的各种标准的日期.示例:要存储的日期 - 'June June 13 Charles II'.我正在尝试确定存储此类日期的适当结构.
编辑:
我修改了我提出的架构.我已在每个表中列出了属性,并通过示例定义了表和属性,在实体框的第三部分中给出.我用这个给出的例子问题和答案通过例如我的定义,我的问题,以对应修改了的例子.虽然我通过描述其他人的例子证明了我的模式,但这种模式可能仍然过于复杂; 过分析; 错过了一些明显的简化,可能很难实现(事实上,这可能是完全错误的).任何意见或建议都是最受欢迎的.

War*_* P 10
如果您正在编写自己的,我假设您打算这样做,我会创建一个包含TDateTime和其他字段的类,并且我将基于非常好编写的Python的mxDateTime扩展中的功能,这非常容易可读,开源,C代码,可用于提取您将需要的格里历日历逻辑.
在一定限度内,TDateTime始终是正确的.它的纪元价值(0)是1899年12月30日午夜.从那里,您可以计算其他朱利安日数.它支持负值,因此它将支持超过400年.我相信在最后一次格里高利历改革时你将开始做更正.如果你从1582年10月15日星期五开始,并找出它的朱利安日数,以及之前和之后的改革,你应该能够做你需要的一切.请注意,一天中的时间在1899年之前"向后"运行,但这在人脑中纯粹是一个问题,计算机将是准确的,并将计算分钟数和秒数,达到双精度浮点数的极限数学为你.坚持使用TDateTime作为基础.
我找到了一些非常古老的BorlandPascal/TurboPascal代码,可以在这里处理各种各样的日期.
如果您需要处理阿拉伯语,犹太语和其他日历,我再次将您称为Python作为工作示例的重要来源.不仅仅是mxdatetime扩展,还有像这样的东西.
对于数据库持久性,如果您需要的最大分辨率为1秒,您可能希望将日期存储基于朱利安日数,将您的时间作为自午夜以来的C类秒.
这是我要开始的代码片段,并执行代码完成:
TCalendarDisplaySubtype = ( cdsGregorian,cdsHebrew,cdsArabic,cdsAztec,
cdsValveSoftwareCompany, cdsWhoTheHeckKnows );
TDateInformation = class
private
FBaseDateTime:TDateTime;
FYear,FMonth,FDay:Integer; // if -1 then not calculated yet.
FCalendarDisplaySubtype:TCalendarDisplaySubtype;
public
function SetByDateInCE(Y,M,D,h,m,s:Integer):Boolean;
function GetAsDateInCE(var Y,M,D,h,m,s:Integer):Boolean;
function DisplayStr:String;
function SetByDateInJewishCalendar( ... );
property BaseDateTime:TDateTime read FDateTime write FDateTime;
property JulianDayNumber:Integer read GetJulianDayNumber write SetJulianDayNumber;
property CalendarDisplaySubType:TCalendarDisplaySubtype;
end;
Run Code Online (Sandbox Code Playgroud)
我认为没有理由同时存储朱利安日数和TDateTime,只需使用常量,从Trunc(FBaseDateTime)值中减去/加,然后在GetJulianDayNumber中返回SetJulianDayNumber函数.对于给定日历计算年,月,日的字段,可能值得一次,并存储它们,使显示为字符串函数更加简单和快速.
更新:看起来你在ER建模方面比我更好,所以如果你发布了这个图表,我会投票给它,那就是它.至于我,我将存储三个领域; 标准化为现代日历标准的Datetime字段,包含任何形式的原始学术日期的文本字段(自由格式),以及一些其他字段,即子类型查找表外键,以帮助我组织和搜索日期按日期和子类型.那对我来说就是IT.
| 归档时间: |
|
| 查看次数: |
1161 次 |
| 最近记录: |