RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1526748
Accepted
ugorek
ugorek
Asked:2023-06-21 09:44:00 +0000 UTC2023-06-21 09:44:00 +0000 UTC 2023-06-21 09:44:00 +0000 UTC

将日期转换为“绝对”日期并返回的算法

  • 772

我的目标是计算给定日期之间和之前的天数0000.00.00 00:00:00,然后执行相反的操作。
我在“索引模式”中指定了月份和日期,所以它们是“ 00”;至于是哪一年,我不知道与它签订的协议。

在一年中的序数日和月/日之间进行转换很简单,因此问题被简化为只有年/序数日。

计算天数是一个小问题,解决起来几乎不难:

isLeap = (yr % 4==0) and (yr % 100!=0) or (yr % 400==0)
result = (yr*365 + yr//4 - yr//100 + yr//400 + int(yr>0)*(not isLeap)) + dy + 1

但把一切都变回来让我感到不安。
头疼了几天,用测试调试,还是没有解决。

例如:
带有索引的年份207 561和带有索引的有序日137都是75 810 237天。
这个数字包括闰年的调整;这也是逆变换的一个问题。

我的智力只能根据天数计算出当年的指数,即:

num = num - 1
num = num - num//146097
num = num - num//-36525
num = num - num//1461
result = num//365

给定天数,如何计算一年中的第几天?

我试图自己解决这个问题,甚至成功了……但由于我不知道的原因,36 600一年后我的方法失效了,每年每100年就会少发行一个。
这是我最接近的解决方案:

type
 HDivModResult=record
  year,day:Int64;
 end;
function AbsoluteDaysToYearLinearDivMod(num:Int64):HDivModResult;
  var
   tmp:Int64;
   tgl:Boolean;
 begin
  Result.year:=0;
  Result.day:=0;
  if num<1 then
   Exit;
  num:=num-1;
  tmp:=num-(num div 146097);
  tmp:=tmp-(tmp div -36525);
  tmp:=tmp-(tmp div 1461);
  Result.year:=tmp div 365;
  tgl:=(Result.year mod 4=0)and(Result.year mod 100<>0)or(Result.year mod 400=0);
  tmp:=((num+Byte(tgl))-(Result.year div 4-Result.year div 100+Result.year div 400));
  Result.day:=tmp mod 365;
  if (tgl)and(Result.day=0) then
   begin
    tmp:=tmp div 365;
    Result.day:=365*Byte(tmp<>Result.year);
   end;
 end;

我理解错了什么?

алгоритм
  • 1 1 个回答
  • 40 Views

1 个回答

  • Voted
  1. Best Answer
    Harry
    2023-06-21T11:47:10Z2023-06-21T11:47:10Z

    朱利安约会来帮助你。或者“算法。就像 2x2 一样”一本书- 那里甚至有一个代码。所有“一次走一天”的建议,考虑到所有闰年和月份的长度,只会给出非常混乱的代码。

    以下是这些神奇的公历来回翻译功能。

    从好的方面来说,必须记住,直到 1918 年,我们都有儒略历(我们称之为旧式日历)。新的功能已经给出。

    因此,自 1529 年左右以来,这些函数就适用于欧洲(甚至不是所有……)。

    代码是用C++编写的,但我想你可以理解。

    long julianDate(int y, int m, int d)
    {
        if (m <= 2) {
            y--;
            m += 12;
        };
        long A = y/100;
        A = 2 - A + A/4;
        long J = (1461L * y)/ 4;
        long K = (306001L*(m + 1))/10000L;
        return J + K + d + 1720995L + A;
    };
    
    void grigorianDate(long JD,
                       int& y,  int& m, int&  d)
    {
        long A = (JD*4 - 7468865L)/146097L;
        A = JD + 1 + A - (A/4L);
        long B = A + 1524;
        long C = (B*20L - 2442L)/7305L;
        long D = (C * 1461L) / 4L;
        long E = (10000L * (B-D)) / 306001L;
        d = B - D - E*306001L/10000L;
        m = ( E <= 13 ) ? E - 1 : E - 13;
        y = ( m > 2 ) ? C - 4716 : C - 4715;
    };
    
    int weekday(long jd) { return (jd+1)%7; }
    // 0 - воскресенье, 1 - понедельник и т.д.
    

    只是我不会看这么远,几千年……在那里,连公历也已经开始失效了,所以如果人类还活着,历法肯定会改变。

    • 3

相关问题

  • Golang 中的堆栈实现

  • 二部图中的最大匹配

  • 求两个数的差模为 m 的倍数的算法

  • 如何将平面几何对象表示为矢量以应用于人工神经网络的输入?[关闭]

  • 如何正确执行矩形的 Delaunay 三角剖分?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5