delphi – 为多个日历,日期和持续时间推荐使用什么数据结构?
我要求存储由多个不同日历引起的日期和持续时间。特别是我需要存储日期:
>跨越不同时期的不同国家的公历日历 我还需要存储我定义为两个时间戳(日期和时间)之间的差异的持续时间。这意味着需要能够存储“零”日期 – 所以我可以存储三个半小时的时间;或10分钟。 我有details的计算需要。 Firebird的时间戳是基于一个日期功能,从100年1月1日开始,所以不能用于我需要记录的时间。此外,这种数据类型被修改(像大多数时间戳功能)一样记录自基准日期以来的天数;它不适合记录日历日期。 有人建议: >存储符合上述要求的日期和持续时间的数据结构 编辑: @Warren P在他的回答中提供了一些出色的工作。我显然没有解释我正在寻找什么,因为他的工作集中在计算和如何计算这些。所有有价值和有用的东西,但不是我打算我的问题来传达。 我确实有各种各样的日期表示之间转换所需的所有计算的细节,而且我对如何实现它们(使用诸如Warren建议的元素)有一个很好的想法。但是,我的要求是存储符合上述各种标准的日期。示例:要存储的日期 – “6月13日查尔斯二世”。我正在努力确定一个适当的结构来存储这些日期。 编辑: 我修改了我提出的模式。我已经列出了每个表上的属性,并通过实例的第三部分给出了例子来定义表和属性。我用例子给出了这个question和answer中给出的例子,并将我的问题中的例子修改为对应。虽然我已经通过描述其他人的例子证明了我的模式,但是这个模式可能仍然过于复杂;过分分析;错过了一些明显的简化,可能证明很难实施(实际上可能是错误的)。任何意见或建议将是最受欢迎的。 解决方法
如果你正在编写自己的,就像我想象的那样,我会做一个包含TDateTime和其他字段的类,我将把它放在Python的非常好的mxDateTime扩展中,这非常容易可读,开源,C代码,您可以使用它来提取您需要的gregorian日历逻辑。
在一定限度内,TDateTime始终是正确的。它的时代价值(0)是1899年12月30日午夜。从那里,您可以计算其他朱利安日数。它支持负值,从而支持400多年。在最后的公历日历改革之初,我相信你会开始修正。如果你从1582年10月15日星期五开始,弄清楚它的朱利安日数,以及之前和之后的改革,你应该能够做所有你需要的。请注意,1899年以前的时间“倒退”,但这纯粹是人脑中的问题,计算机将会准确,并计算出分钟数和秒数,最多可达到双精度浮点数数学为你坚持使用TDateTime作为您的基础。 我发现一些非常老的BorlandPascal / TurboPascal代码处理了非常广泛的日期here。 如果您需要处理阿拉伯语,犹太教和其他日历,那么我将您引用到Python作为工作示例的重要来源。不只是mxdatetime扩展名,而是像this这样的东西。 对于数据库持久性,如果您需要的最大分辨率为1秒,您可能希望将日期存储设置为围绕julian日数,并将您的时间从午夜开始为C-like秒。 这是一个我将开始的代码片段,并执行代码完成: 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,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; 我没有理由存储julian日号和TDateTime,只需使用常量,从Trunc(FBaseDateTime)值中减去/添加,并在GetJulianDayNumber中返回SetJulianDayNumber函数。这可能值得让您计算年,月,日,给定日历一次的存储区域,并使其显示为字符串函数更加简单快捷。 更新:看起来你的ER建模比我好,所以如果你发布了这个图表,我会upvote它,就是这样。对我来说,我会存储三个字段;标准化为现代日历标准的日期时间字段,以任何形式包含原始学术日期的文本字段(自由格式),以及其他几个字段,即子类型查找表外键,帮助我组织和搜索日期按日期和子类型。这对我而言是IT。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |