根据儒略日计算实际时间 c#+mysql

来源:互联网 发布:李天生sql视频云盘 编辑:程序博客网 时间:2024/05/03 12:10

儒略日(Julian day)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。
求出给定年(I),月(J),日(K)的儒略日:
儒略日= K - 32075 + 1461 * (I + 4800 + (J-14)/12)/4+367*(J-2-(J-14)/12*12)/12-3*((I+4900+(J-14)/12)/100)/4
网上只找到了如何将时间转成如略日,由于工作需要,要求将如略日转回实际时间。

特此写了c#和mysql的转换方法。

c# 

/// <summary>
        /// 根据儒略日计算实际时间(王月 11月23日)
        /// </summary>
        /// <param name="num"></param>
        /// <param name="StartTime"></param>
        /// <returns></returns>
        public static DateTime GetNormal(double num, DateTime StartTime)
        {
            double num1 = Math.Floor(num);
            double year = num1 / 365.25;
            double ThisYear = Math.Floor(year);
            double month = (year - ThisYear) * 365.25f / 30.4375f;
            double ThisMonth = Math.Floor(month); 
            double day = (month - ThisMonth) * 30.4375f;
            double ThisDay = Math.Floor(day);
            int ThisHour = 0;
            double hour = (day - ThisDay) * 24;
            int h = 0;
            if (hour > 20) h = 1;
            int f = Convert.ToInt32((num - num1) * 100);
            switch (f)
            {
                case 0:
                    ThisHour = 0; break;
                case 25:
                    ThisHour = 6; break;
                case 50:
                    ThisHour = 12; break;
                case 75:
                    ThisHour = 18; break;
                default: break;
            }
            StartTime = StartTime.AddDays(ThisDay + 1 + h);
            StartTime = StartTime.AddMonths(Convert.ToInt32(ThisMonth));
            StartTime = StartTime.AddYears(Convert.ToInt32(ThisYear));
            DateTime dt = new DateTime(StartTime.Year, StartTime.Month, StartTime.Day, ThisHour, 0, 0);
            return dt;
        }

 

调用: GetNormal(16025.5, new DateTime(1858, 11, 17));

 

mysql:

DELIMITER $$
DROP FUNCTION IF EXISTS test.hello $$
CREATE FUNCTION test.hello (num varchar(50)) RETURNS datetime
begin
declare outvalue datetime;
declare ThisYear int(10);
declare ThisMonth int(10);
declare ThisDay int(10);
declare ThisHour int(10);
declare hours double;
declare h int(10);
declare f int(10);
declare thisdayh int(10);

set ThisYear = floor(floor(num)/ 365.25);
set ThisMonth = floor((floor(num)/ 365.25- ThisYear) * 365.25 / 30.4375);
set ThisDay = floor(((floor(num)/ 365.25- ThisYear) * 365.25 / 30.4375-ThisMonth)* 30.4375);
set hours = (((floor(num)/ 365.25- ThisYear) * 365.25 / 30.4375-ThisMonth)* 30.4375 - ThisDay)*24;
set h = if(hours>20,1,0);
set f = (num - floor(num))*100;

set ThisHour = if(f=0,0, ThisHour);
set ThisHour = if(f=25,6, ThisHour);
set ThisHour = if(f=50,12, ThisHour);
set ThisHour = if(f=75,18, ThisHour);
set thisdayh = ThisDay + 1 + h;
set outvalue = CAST('1858-11-17' as datetime);
set outvalue = DATE_ADD('1858-11-17 00:00:00',INTERVAL thisdayh DAY);
set outvalue = DATE_ADD(outvalue, Interval ThisMonth month);
set outvalue = DATE_ADD(outvalue, Interval ThisYear YEAR);
set outvalue = DATE_ADD(outvalue, Interval ThisHour HOUR);

RETURN outvalue;
END $$
DELIMITER ;

 

调用:update test.tab set time2 = hello(time1);///time1是如略日的字段,time2是添加的北京时间的字段

原创粉丝点击