使用Ruby Date类获取天文数据

〜近似太阳中午

lw = 88.743 # my longitude jdate = Date.ordinal_to_jd(Time.now.year, Time.now.yday) n = (jdate - 2451545 - 0.0009 - lw / 360).round # lw is users longitude west of 0. j_noon = 2451545 + 0.0009 + lw / 360 + n puts j_noon => 2455616.24740833 

作为更新,部分混乱将是太阳正午是所有计算从公元前4713年1月1日格林威治中午开始的地方。

正确使用Date.ordinal_to_jd并没有补偿这一事实。 所以通过这样添加或减去12个小时:

 jdn = Date.ordinal_to_jd(Time.now.year, Time.now.yday) - 0.5 

我们应该减少错误。 我们使用哪个,因为我们的计算从昨天中午开始?

代码来自此页面Sunrise_equation中的两个方程式。

我在这里得到的第一个答案是我们不理解0.0009和lw / 360的使用.lw / 360似乎是来自本初子午线的弧的一小部分。 至于0.0009,它必须是自公元前4713年1月1日格林威治中午以来的少量变化。 有关更多信息,请参阅IAU标准

根据这个页面我计算它是0.007776秒。

我从Date类中获得了一些信息,不包括方法细节。

  =begin --------------------------------------------------------------------- Class: Date Class representing a date. See the documentation to the file date.rb for an overview. Internally, the date is represented as an Astronomical Julian Day Number, ajd. The Day of Calendar Reform, sg, is also stored, for conversions to other date formats. (There is also an of field for a time zone offset, but this is only for the use of the DateTime subclass.) A new Date object is created using one of the object creation class methods named after the corresponding date format, and the arguments appropriate to that date format; for instance, Date::civil() (aliased to Date::new()) with year, month, and day-of-month, or Date::ordinal() with year and day-of-year. All of these object creation class methods also take the Day of Calendar Reform as an optional argument. Date objects are immutable once created. Once a Date has been created, date values can be retrieved for the different date formats supported using instance methods. For instance, #mon() gives the Civil month, #cwday() gives the Commercial day of the week, and #yday() gives the Ordinal day of the year. Date values can be retrieved in any format, regardless of what format was used to create the Date instance. The Date class includes the Comparable module, allowing date objects to be compared and sorted, ranges of dates to be created, and so forth. --------------------------------------------------------------------------------- Includes: Comparable(<, , >=, between?) Constants: MONTHNAMES: [nil] + %w(January February March April May June July August September October November December) DAYNAMES: %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday) ABBR_MONTHNAMES: [nil] + %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) ABBR_DAYNAMES: %w(Sun Mon Tue Wed Thu Fri Sat) ITALY: 2299161 ENGLAND: 2361222 JULIAN: Infinity.new GREGORIAN: -Infinity.new Class methods: _load, _parse, _strptime, ajd_to_amjd, ajd_to_jd, amjd_to_ajd, civil, civil_to_jd, commercial, commercial_to_jd, day_fraction_to_time, gregorian?, gregorian_leap?, jd, jd_to_ajd, jd_to_civil, jd_to_commercial, jd_to_ld, jd_to_mjd, jd_to_ordinal, jd_to_wday, julian?, julian_leap?, ld_to_jd, mjd_to_jd, new, now, ordinal, ordinal_to_jd, parse, s3e, strptime, time_to_day_fraction, today, valid_civil?, valid_commercial?, valid_jd?, valid_ordinal?, valid_time? Instance methods: +, -, <<, , ===, >>, _dump, ajd, amjd, asctime, civil, commercial, ctime, cwday, cweek, cwyear, day, day_fraction, downto, england, eql?, gregorian, gregorian?, hash, hour, inspect, italy, jd, julian, julian?, ld, leap?, mday, min, mjd, mon, month, new_offset, new_start, next, next_day, offset, ordinal, sec, sec_fraction, start, step, strftime, succ, time, to_s, to_yaml, upto, wday, weeknum0, weeknum1, wnum0, wnum1, yday, year, zone =end 

作为旁注,Ruby很有可能计算julian-date。 我正在研究NOAA的Javascript代码。

这是一个我通过链接创作的课程。

 class JulianDayNumber def initialize(year = 2000, month = 1, day = 1) #defaults to Jan. 01, 2000 @year = year @month = month @day = day end def calcJDN if (@month  2455622.5 

现在这让我在那里,但我仍在研究一个数字的方式,例如最顶层方程式计算的数字。 尝试这个我们可以看到我们在JDN中得到0.5。 谁是对的? Ruby或NOAA?


NOAA使用从jd中减去的2000年1月1日值2451545.0来获得像这样的分数世纪的时间

  def calcTimeJulianCent(j) t = (j - 2451545.0)/36525.0 return t end 

Ruby有很多计算朱利安日的方法,你需要选择正确的方法。 如你所知,NOAA自公元前4713年1月1日格林威治中午开始计算JD。 它始终以.5结尾,因为它们会遗漏分数天。

Ruby的朱利安日很奇怪:

出于科学目的,将日期简单地称为日期计数是方便的,从任意的初始日算起。 首先选择的日期是公元前4713年1月1日。 从该日期算起的天数是Julian Day Number或Julian Date,在Date类中缩写为jd。 这是当地时间,从第一天的午夜算起。

这对于天文学使用毫无意义。 可是等等..

更严格的使用是UTC,从初始中午算起。 这在Date类中称为Astronomical Julian Day Number,缩写为ajd。 在Date类中,Astronomical Julian Day Number包括小数天。

( rubydoc )

这就是你要找的东西,ajd。 只是在没有分数天的情况下得到它:

 julianday = Date.civil(@year, @month, @day).ajd puts julianday => 2455622.5 

无需从NOAA移植9行JavaScript。 Ruby让你回来了! ;)

方法ordinal_to_jd将2011年(公历)的索引0的日转换为儒略日历中的相应日,然后您使用的神奇值为0.0009,我不知道任何原因,那么您正在添加比率你整个360 *圈的经度(东方或西方?)然后加上今天的每年(如果你今天评估的话,则为54)。 朱利安日历和纵向比率的组合没有多大意义,但嘿它是一个很好的数字,因为你混合了0.0009英寸。

谢谢大家,我想我现在可以回答我自己的问题了。 我忽略了Date类中的一个简单方法。 它是Date.day_fraction_to_time(日小数)。 由于我现在有一个工作程序,我想与eveyone分享。

 include Math to_r = PI / 180.0 to_d = 180.0 / PI latitude = 41.9478 # my latitude longitude = 88.74277 # my longitude lw = longitude / 360 jdate = Date.civil(Time.now.year, Time.now.month, Time.now.day).ajd jdate = (jdate * 2).to_i/2 + 1 n = (jdate - 2451545 - 0.0009 - lw).round j_noon = 2451545 + 0.0009 + lw + n mean_anomaly = (357.52911 + 0.98560028 * (jdate - 2451545)) % 360 center = 1.9148 * sin(mean_anomaly * to_r) + 0.0200 * sin(2 * mean_anomaly * to_r) + \ 0.0003 * sin(3 * mean_anomaly * to_r) lambda = (mean_anomaly + 102.9372 + center + 180) % 360 j_transit = j_noon + (0.0053 * sin(mean_anomaly * to_r)) - (0.0069 * sin(2 * lambda * \ to_r)) delta = asin(0.397753054 * sin(lambda * to_r)) * to_d omega = acos(sin(-0.83 * to_r)/cos(latitude * to_r) * cos(delta * to_r) \ - tan(latitude * to_r) * tan(delta * to_r)) * to_d j_set = 2451545 + 0.0009 + ((omega + longitude)/360 + n + 0.0053 * sin(mean_anomaly * \ to_r)) - 0.0069 * sin(2 * lambda * to_r) j_rise = j_transit - (j_set - j_transit) rise = Date.day_fraction_to_time(j_rise - jdate)# + 0.25 for + 6 hours risehour = rise[0].to_s risemin = rise[1].to_s risetime = "#{risehour}:#{risemin}" puts "Sun rise = #{risetime} UTC" transit = Date.day_fraction_to_time(j_transit - jdate)# + 0.25 transithour = transit[0].to_s transitmin = transit[1].to_s transittime = "#{transithour}:#{transitmin}" puts "Solar noon = #{transittime} UTC" set = Date.day_fraction_to_time(j_set - jdate)# + 0.25 sethour = set[0].to_s setmin = set[1].to_s settime = "#{sethour}:#{setmin} UTC" puts "Sun set = #{settime}"