delphi – 为多个日历,日期和持续时间推荐使用什么数据结构?

前端之家收集整理的这篇文章主要介绍了delphi – 为多个日历,日期和持续时间推荐使用什么数据结构?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我要求存储由多个不同日历引起的日期和持续时间。特别是我需要存储日期:

>跨越不同时期的不同国家的公历日历
>涵盖至少500年的历史时期
>处理多种日历 – 月球,太阳能,中国人,金融,基督教,UTC,穆斯林。
>处理英国在截至3月31日至12月31日止年度的变化以及其他国家的可比变化。

我还需要存储我定义为两个时间戳(日期和时间)之间的差异的持续时间。这意味着需要能够存储“零”日期 – 所以我可以存储三个半小时的时间;或10分钟。

我有details的计算需要。 Firebird的时间戳是基于一个日期功能,从100年1月1日开始,所以不能用于我需要记录的时间。此外,这种数据类型被修改(像大多数时间戳功能)一样记录自基准日期以来的天数;它不适合记录日历日期。

有人建议:

>存储符合上述要求的日期和持续时间的数据结构
>引用这样的数据结构OR
>提供指导方针来构建这种存储OR
任何可能帮助我解决问题的方面。

编辑:

@Warren P在他的回答中提供了一些出色的工作。我显然没有解释我正在寻找什么,因为他的工作集中在计算和如何计算这些。所有有价值和有用的东西,但不是我打算我的问题来传达。

我确实有各种各样的日期表示之间转换所需的所有计算的细节,而且我对如何实现它们(使用诸如Warren建议的元素)有一个很好的想法。但是,我的要求是存储符合上述各种标准的日期。示例:要存储的日期 – “6月13日查尔斯二世”。我正在努力确定一个适当的结构来存储这些日期。

编辑:

修改了我提出的模式。我已经列出了每个表上的属性,并通过实例的第三部分给出了例子来定义表和属性。我用例子给出了这个questionanswer中给出的例子,并将我的问题中的例子修改为对应。虽然我已经通过描述其他人的例子证明了我的模式,但是这个模式可能仍然过于复杂;过分分析;错过了一些明显的简化,可能证明很难实施(实际上可能是错误的)。任何意见或建议将是最受欢迎的。

解决方法

如果你正在编写自己的,就像我想象的那样,我会做一个包含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。

猜你在找的Delphi相关文章