文档章节

公历、儒略日互转

清江堤畔
 清江堤畔
发布于 2017/08/28 15:36
字数 623
阅读 10
收藏 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
C#下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

sxtwl_cpp是寿星天文历的C++版本实现。支持多种语言的绑定 代码首页 懒人包 懒人包使用方法 1、右链工程中的引用-》添加引用-》浏览-》选中dotnet目录下的sxtwl.net.dll 2、生成解决方案-》找...

元谷
09/21
0
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

sxtwl_cpp是寿星天文历的C++版本实现。支持多种语言的绑定 python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 最终如下面代码所示: 最后在dependencies中加入 即可 使用事例:...

元谷
09/21
0
0
EOJ 3322 万年历(历史题)

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

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

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

vip_oschina
2015/02/03
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

C4C销售订单行项目价格维护方法

需求很简单,能够创建销售订单,在行项目里添加产品,带出价格来,同时把总价显示在销售订单抬头区域。 如下图所示: 下面是具体配置。 Business Configuration里,点击Sales Order的配置: ...

JerryWang_SAP
41分钟前
9
0
deepin中配置robot framework环境

本文永久更新地址:https://my.oschina.net/bysu/blog/2989005 【若要到岸,请摇船:开源中国 不最醉不龟归】 1.在终端中输入pip,回车,如果提示没有该命令,则先安转pip sudo apt-get inst...

不最醉不龟归
今天
8
0
OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
今天
204
5
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
24
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
33
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部