文档章节

公历、儒略日互转

清江堤畔
 清江堤畔
发布于 2017/08/28 15:36
字数 623
阅读 7
收藏 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
0
EOJ 3322 万年历(历史题)

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

fwq990720
2017/11/08
0
0
小米3日历的日期(阴阳历)选择器源码?

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

vip_oschina
2015/02/03
970
1
波斯跳火节(چهارشنبه سوری)

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

若仙rose
03/14
0
0
怎么用金蝶kis记账王修改会计期间

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

石沉大海
2016/12/13
5
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
9
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部