草庐IT

c# - 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?)

coder 2023-07-10 原文

我需要将标准的Gregorian 日期转换为Julian 日期。

我没有在 C# 中看到任何直接执行此操作的文档,但我发现很多帖子(在谷歌搜索时)建议使用 ToOADate .

关于 ToOADate 的文档不建议将此作为 Julian 日期的有效转换方法。

谁能说明这个函数是否会准确地执行转换,或者是否有更合适的方法将 DateTime 转换为 Julian 格式的字符串。


This当根据 Wikipedia's Julian Day page 验证时,为我提供了预期的数字

public static long ConvertToJulian(DateTime Date)
{
    int Month = Date.Month;
    int Day = Date.Day;
    int Year = Date.Year;

    if (Month < 3)
    {
        Month = Month + 12;
        Year = Year - 1;
    }
    long JulianDay = Day + (153 * Month - 457) / 5 + 365 * Year + (Year / 4) - (Year / 100) + (Year / 400) + 1721119;
    return JulianDay;
}

但是,这是在不了解所使用的魔数(Magic Number)的情况下进行的。

谢谢


引用资料:

最佳答案

OADate 类似于 Julian Dates,但使用不同的起点(1899 年 12 月 30 日与公元前 4713 年 1 月 1 日),以及不同的“新日”点。 Julian Dates 认为中午是新一天的开始,OADates 使用现代定义,午夜。

儒略历 1899 年 12 月 30 日午夜是 2415018.5。此方法应为您提供正确的值:

public static double ToJulianDate(this DateTime date)
{
    return date.ToOADate() + 2415018.5;
}

至于算法:

  • if (Month < 3) ... :为了让神奇的数字发挥作用,他们将 2 月定为一年的“年底”。
  • (153 * Month - 457) / 5 : 哇,这是一些非常神奇的数字。
    • 通常,每个月的天数是 31 28 31 30 31 30 31 31 30 31 30 31,但在 if 语句中调整后,它变成 31 30 31 30 31 31 30 31 30 31 31 28。或者,减去 30,最后得到 1 0 1 0 1 1 0 1 0 1 1 -2。他们通过在整数空间中进行除法来创建 1 和 0 的模式。
    • 重写为 float ,为(int)(30.6 * Month - 91.4) . 30.6 是每月的平均天数,不包括 2 月(准确地说是 30.63 重复)。 91.4 几乎是 3 个非 2 月份的平均天数。 (30.6 * 3 是 91.8)。
    • 那么,让我们去掉 30 天,只关注那 0.6 天。如果我们将它乘以月数,然后截断为整数,我们将得到 0 和 1 的模式。
      • 0.6 * 0 = 0.0 -> 0
      • 0.6 * 1 = 0.6 -> 0(相差 0)
      • 0.6 * 2 = 1.2 -> 1(相差 1)
      • 0.6 * 3 = 1.8 -> 1(相差 0)
      • 0.6 * 4 = 2.4 -> 2(相差 1)
      • 0.6 * 5 = 3.0 -> 3(相差 1)
      • 0.6 * 6 = 3.6 -> 3(相差 0)
      • 0.6 * 7 = 4.2 -> 4(相差 1)
      • 0.6 * 8 = 4.8 -> 4(相差 0)
    • 看到右边的差异模式了吗?这与上面列表中的模式相同,每个月的天数减去 30。减去 91.8 将补偿前三个月的天数,这些天数被移至年末,并调整它通过 0.4 移动 1 的连续差异(上表中的 0.6 * 4 和 0.6 * 5)以与 31 天的相邻月份对齐。
    • 由于二月现在是一年的“年底”,我们不需要处理它的长度。它可能有 45 天(闰年为 46 天),唯一需要改变的是一年中天数的常量 365。
    • 请注意,这取决于 30 个月和 31 个月的天数模式。如果我们连续两个月都是 30 天,这是不可能的。
  • 365 * Year : 每年的天数
  • (Year / 4) - (Year / 100) + (Year / 400) : 每 4 年加一闰日,每 100 减一,每 400 加一。
  • + 1721119 :这是公元前 1 年 3 月 2 日的儒略日期。由于我们将日历的“开始”从 1 月移到了 3 月,因此我们将其用作偏移量,而不是 1 月 1 日。由于没有零年,1 BC 得到整数值 0。至于为什么 3 月 2 日而不是 3 月 1 日,我猜那是因为整个月的计算最后还是有点偏差。如果原作者使用了- 462而不是 - 457 (- 92.4 而不是 float 学中的 - 91.4),那么偏移量将是 3 月 1 日。

关于c# - 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248827/

有关c# - 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?)的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  7. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  8. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  9. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  10. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

随机推荐