文档章节

公历、儒略日互转

清江堤畔
 清江堤畔
发布于 2017/08/28 15:36
字数 623
阅读 7
收藏 0
点赞 0
评论 0

	#region 公历、儒略日互转

	/// <summary>
	/// 给定公历的日期,返回对应的儒略日
	/// </summary>
	/// <paramname="date">给定的公历日期</param>
	/// <returns>儒略日</returns>
	public static double DateToJd(DateTime date)
	{
		return DateToJd(date.Year,date.Month,date.Day);
	}

	/// <summary>
	/// 给定公历的年月日,返回对应的儒略日
	/// </summary>
	/// <param name="year">年</param>
	/// <param name="month">月</param>
	/// <param name="day">日</param>
	/// <returns>儒略日</returns>
	public static double DateToJd(int year,int month,int day)
	{

		double jd;
		double w;
		jd = year + (month + day / 100.0) / 100.0;
		if (jd > 1582.1014)
		{
			w = -Math.Floor(year / 100.0) + Math.Floor(year / 400.0) + 2;
		}
		else if (jd < 1582.1005)
		{
			w = 0;
		}
		else
		{
			return 0;
		}

		if (month < 2.5)
		{
			month = month + 12;
			year = year - 1;
		}

		jd = Math.Floor(365.25 * year) + Math.Floor(30.6 * (month + 1)) + day + w + 1720994.5;

		return jd;

	}

	/// <summary>
	/// 儒略日转公历
	/// </summary>
	/// <param name="jd">指定的儒略日</param>
	/// <returns>文本格式的公历日期(年/月/日)</returns>
	public static string JdToDate(double jd)
	{
		if (jd < 2299160.5)
		{
			return JdToDateS(jd);
		}
		else
		{
			return JdToDateL(jd);
		}
	}

	
	private static string JdToDateS(double jd)
	{ 
		// 按指定的儒略日计算 公元1582年10月4日 及之前日期的文本格式公历日期,以“/”为分隔符
		
		double xs = jd - Math.Floor(jd);  // 儒略日的小数部分
		if (xs < 0.5)                   // 如果小数部份小于0.5,则是前一天的日期
		{
			jd = jd - 0.5;  // 取输入日期的整数部份减半天,方便计算
		}
		else
		{
			jd = jd + 0.5;  // 取输入日期的整数部份减半天,方便计算
		}
		
		int month = 3;
		int day = 1;

		int year = (int)Math.Floor((jd - 0 - 1721116.5) / 365.25);
		double S = jd - 1721116.5 - Math.Floor(365.25 * year);
		if (S == 0)
		{
			year = year - 1;
			S = jd - 1721116.5 - Math.Floor(365.25 * year);
		}

		month = (int)(Math.Floor((S + 122) / 30.6) - 1);
		day = (int)(S + 122 - Math.Floor(30.6 * (month + 1)));
		if (day == 0)
		{
			month = month - 1;
			day = (int)(S + 122 - Math.Floor(30.6 * (month + 1)));
		}

		return year.ToString() + "/" + month.ToString() + "/" + day.ToString();

	}  

	private static string JdToDateL(double jd)
	{ 
		// 按指定的儒略日计算 公元1582年10月15日 及之后日期的文本格式公历日期,以“/”为分隔符
		
		double xs = jd - Math.Floor(jd);  // 儒略日的小数部分
		if (xs < 0.5)                   // 如果小数部份小于0.5,则是前一天的日期
		{
			jd = jd - 0.5;  // 取输入日期的整数部份减半天,方便计算
		}
		else
		{
			jd = jd + 0.5;  // 取输入日期的整数部份减半天,方便计算
		}
		
		// ------------------------------------------------------------------

		int year = (int)Math.Floor((jd - 0 - 1721116.5) / 365.25);
		// double w = -Math.Floor(year / 100.0) + Math.Floor(year / 400.0) + 2;
		// double S = jd - w - 1721116.5 - Math.Floor(365.25 * year);


		double w = -10;
		for (int y = 1582; y != year; y++)
		{
			year = (int)Math.Floor((jd - 1721116.5 - w) / 365.25);
			w = -Math.Floor(year / 100F) + Math.Floor(year / 400F) + 2;
		}

		double S = jd - w - 1721116.5 - Math.Floor(365.25 * year);

		// ------------------------------------------------------------------

		if (S == 0)
		{
			year = year - 1;
			w = -Math.Floor(year / 100.0) + Math.Floor(year / 400.0) + 2;
			S = jd - w - 1721116.5 - Math.Floor(365.25 * year);
		}

		int month = 3;
		int day = 1;

		month = (int)(Math.Floor((S + 122) / 30.6) - 1);
		day = (int)(S + 122 - Math.Floor(30.6 * (month + 1)));

		if (day == 0)
		{
			month = month - 1;
			day = (int)(S + 122 - Math.Floor(30.6 * (month + 1)));
		}

		return year.ToString() + "/" + month.ToString() + "/" + day.ToString();

	}



	#endregion

 

© 著作权归作者所有

共有 人打赏支持
清江堤畔
粉丝 3
博文 5
码字总数 2879
作品 0
中山
程序员
寿星天文历的 C++ 实现版本--sxtwl_cpp

项目背景 在公司一次下午茶的偶然的聊天,有位同事说如果有软件能够获取古代农历来研究古人八字就好了。然后,我就找了网上基本上所有和农历相关的的软件,其中包括ubuntu kylin的[优客农历]...

元谷 ⋅ 2017/05/20 ⋅ 0

EOJ 3322 万年历(历史题)

为什么说是历史题? 来自某百科: 罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继1...

fwq990720 ⋅ 2017/11/08 ⋅ 0

小米3日历的日期(阴阳历)选择器源码?

我想实现一款公历农历日期转换的日期选择器控件。自己也做了很久,但是在涉及到闰月的时候公历转农历或者农历转公历就会出现问题。没办法在这里向大家求助了。最好的实现方式是小米3自带的日...

vip_oschina ⋅ 2015/02/03 ⋅ 1

波斯跳火节(چهارشنبه سوری)

跳火节快乐 伊朗历最后一个星期三是传统的跳火节(چهارشنبه سوری)。在这天的晚上,人们点燃火堆、火把,迎接喜庆。外国人把这个传统庆祝活动称为跳火节,伊朗人自己则称为“红色...

若仙rose ⋅ 03/14 ⋅ 0

怎么用金蝶kis记账王修改会计期间

许多金蝶KIS记账王用户,尤其是新手用户在使用软件做账过程中会有这样的疑惑,即新建账套后突然发现账套启用会计期间设置错误,此时是否可以修改呢?答案是不可以,因为金蝶KIS记账王不支持反...

石沉大海 ⋅ 2016/12/13 ⋅ 0

每天一个linux命令(38):cal 命令

cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。 1.命...

长平狐 ⋅ 2013/06/17 ⋅ 0

SQLite 常用 SQL

SQLite 常用 SQL 主键自增 创建表时将主键列设置为 INTEGER PRIMARY KEY , 例如: 最后插入的行号 查看最后插入的行号是用 lastinsertrowid() 函数, 与 SQL Server 的 @@Identity 类似,例...

postdep ⋅ 2014/04/13 ⋅ 0

谈谈历法知识

新春期间,我忍不住又想到了一个老问题: 为什么每年春节的日期都不一样? 从2007年到2010年,春节的日期分别为2月18日、2月7日、1月26日、2月14日和2月3日。为什么会这样?到底是怎么计算的...

阮一峰 ⋅ 2009/01/26 ⋅ 0

你们真的知道什么是“闰年“么?

大家觉得Linux上的日历命令对不对? 为什么1700年是闰年!!! chenqi@chenqi-laptop ~ $ cal 2 1700 二月 1700 一 二 三 四 五 六 日 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...

ChenQi ⋅ 2012/05/18 ⋅ 12

[Python] (Day-20) - 日期和时间

Only I can change my life. No one can do it for me. 只有我可以改变我的命运,没有人可以帮我做。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间 时间间隔是以秒为单...

Mazy ⋅ 2017/11/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 31分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 54分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 56分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 今天 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部