<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FDixonD%2FDatetime%2FJulian</id>
	<title>Module:Sandbox/DixonD/Datetime/Julian - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FDixonD%2FDatetime%2FJulian"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/DixonD/Datetime/Julian&amp;action=history"/>
	<updated>2026-05-26T12:41:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/DixonD/Datetime/Julian&amp;diff=145341&amp;oldid=prev</id>
		<title>imported&gt;Verdy p at 17:26, 20 April 2013</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/DixonD/Datetime/Julian&amp;diff=145341&amp;oldid=prev"/>
		<updated>2013-04-20T17:26:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Error = require(&amp;#039;Module:Error&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
local this = {};&lt;br /&gt;
&lt;br /&gt;
function this.julianDayOfDate(date)&lt;br /&gt;
    -- http://www.tondering.dk/claus/cal/julperiod.php#formula&lt;br /&gt;
    local y = date.year + 4799;                     -- Set epoch in 1 March -4800, but counting months from January as the 10th month of previous year.&lt;br /&gt;
    local m = y * 12 + date.month + 9;              -- Total number of months since epoch (January = 10, December = 21).&lt;br /&gt;
    y = math.floor(m / 12); m = m - y * 12;         -- Split total months into relative months...&lt;br /&gt;
    return&lt;br /&gt;
          math.floor(y * 1461 / 4)                  -- Julian cycle of 1461 days every 4 years.&lt;br /&gt;
        + math.floor((m + 4) * 153 / 5)             -- Days in relative month (need to substract 122 at end).&lt;br /&gt;
        + date.day                                  -- Additional days (need to substract 1 at end).&lt;br /&gt;
        + (date.hour - 12) / 24                     -- The time part.&lt;br /&gt;
        + date.minute / 1440&lt;br /&gt;
        + date.second / 86400                       -- (leap seconds ignored, every day assumed to be 86400 seconds exactly).&lt;br /&gt;
        - 32204;                                    -- Final substractive constant 32204 == 32081 + 122 + 1.&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function this.dateOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    local date = {};&lt;br /&gt;
    date.weekday = JD + 0.5 - math.floor((JD + 0.5) / 7) * 7; -- 0 = Monday, 6 = Sunday.&lt;br /&gt;
 &lt;br /&gt;
    -- See [[fr:Formules de calcul du calendrier grégorien]] on Wikipedia for explained details and intermediate values in test cases.&lt;br /&gt;
    JD = JD + 32081.5;&lt;br /&gt;
    local j = math.floor(JD); -- no rounding performed for the precision of time; if you need it, round the JD before calling this method.&lt;br /&gt;
 &lt;br /&gt;
    -- 1461 days per cycle of 4 years (no adjustment needed).&lt;br /&gt;
    local b  = math.floor(dc / 1461);&lt;br /&gt;
    local db = dc - b * 1461;&lt;br /&gt;
 &lt;br /&gt;
    -- 365 days per cycle of 1 year (cycle numbers: 0 to 4; but 4 is reduced to 3, making sometimes the last cycle longer longer by 1 day).&lt;br /&gt;
    -- Note: for a in 0..4: math.min(a, 3) is equal to math.floor((a * 3 + 1) / 4); this avoids conditional branches:&lt;br /&gt;
    --       0 -&amp;gt; 0 = floor(1 / 4); 1 -&amp;gt; 1 = floor(4 / 4); 2 -&amp;gt; 2 = floor(7 / 4); 3 -&amp;gt; 3 = floor(10 / 4); 4 -&amp;gt; 4 = floor(13 / 4)&lt;br /&gt;
    local a  = math.floor((math.floor(db / 365) * 3 + 1) / 4);&lt;br /&gt;
    local da = db - a * 365;&lt;br /&gt;
 &lt;br /&gt;
    -- Relative date since epoch (1 March -4800).&lt;br /&gt;
    local y = b * 4 + a;&lt;br /&gt;
    local m = math.floor((da * 5 + 308) / 153) - 2;&lt;br /&gt;
    local d = da - math.floor((m + 4) * 153 / 5) + 122;&lt;br /&gt;
 &lt;br /&gt;
    -- Actual Julian date.&lt;br /&gt;
    date.year   = y - 4800 + math.floor((m + 2) / 12);&lt;br /&gt;
    date.month  = m - math.floor((m + 2) / 12) * 12 + 3;&lt;br /&gt;
    date.day    = d + 1;--//Test:1&lt;br /&gt;
 &lt;br /&gt;
    -- Actual time of day (leap seconds ignored, every day assumed to be 86400 seconds exactly).&lt;br /&gt;
    j = (JD + 0.5 - math.floor(JD + 0.5)) * 24;&lt;br /&gt;
    date.hour   = math.floor(j);&lt;br /&gt;
    j = (j - date.hour) * 60;&lt;br /&gt;
    date.minute = math.floor(j);&lt;br /&gt;
    date.second = (j - date.minute) * 60; -- No rounding performed; this includes fractions of seconds.&lt;br /&gt;
    return date;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.julianDay(year, month, day, hour, minute, second)&lt;br /&gt;
    -- Check parameters and set defaults.&lt;br /&gt;
    if year == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;year&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end; &lt;br /&gt;
    if month  == nil then month  = 1;  end;&lt;br /&gt;
    if day    == nil then day    = 1;  end;&lt;br /&gt;
    if hour   == nil then hour   = 12; end;&lt;br /&gt;
    if minute == nil then minute = 0;  end;&lt;br /&gt;
    if second == nil then second = 0;  end;&lt;br /&gt;
    return this.julianDayOfDate({year = year, month = month, day = day, hour = hour, minute = minute, second = second});&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
-- Basic formatting (for debugging only ?).&lt;br /&gt;
function this.wikiDateOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    local date = this.dateOfJulianDay(JD);&lt;br /&gt;
    return        tostring(date.year)&lt;br /&gt;
        .. &amp;quot;|&amp;quot; .. tostring(date.month)&lt;br /&gt;
        .. &amp;quot;|&amp;quot; .. tostring(date.day)&lt;br /&gt;
        .. &amp;quot;|&amp;quot; .. tostring(date.hour)&lt;br /&gt;
        .. &amp;quot;|&amp;quot; .. tostring(date.minute)&lt;br /&gt;
        .. &amp;quot;|&amp;quot; .. tostring(date.second);&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
-- English formatting (for display or tests ? not internationalized).&lt;br /&gt;
function this.EnglishDateOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    local date = this:dateOfJulianDay(JD);&lt;br /&gt;
    &lt;br /&gt;
    local s = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (date &amp;gt;= 0 and date.day &amp;lt; 10) then&lt;br /&gt;
        s = s .. &amp;quot;0&amp;quot; .. tostring(date.day);&lt;br /&gt;
    else&lt;br /&gt;
        s = s ..        tostring(date.day);&lt;br /&gt;
    end&lt;br /&gt;
    local months = {&lt;br /&gt;
        &amp;quot;January&amp;quot;, &amp;quot;February&amp;quot;, &amp;quot;March&amp;quot;, &amp;quot;April&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;June&amp;quot;,&lt;br /&gt;
        &amp;quot;July&amp;quot;, &amp;quot;August&amp;quot;, &amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;, &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
    s = s .. &amp;quot; &amp;quot; .. months[date.month - 1] .. &amp;quot; &amp;quot;;&lt;br /&gt;
    if (date.year &amp;lt; 0) then&lt;br /&gt;
        s = s .. tostring(1 - date.year) .. &amp;quot; BC &amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        s = s .. tostring(date.year)     .. &amp;quot; AD &amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if (date.hour &amp;gt;= 0 and date.hour &amp;lt; 10) then&lt;br /&gt;
        s = s .. &amp;quot;0&amp;quot; .. tostring(date.hour) .. &amp;quot;:&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        s = s ..        tostring(date.hour) .. &amp;quot;:&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if (date.minute &amp;gt;= 0 and date.minute &amp;lt; 10) then&lt;br /&gt;
        s = s .. &amp;quot;0&amp;quot; .. tostring(date.minute) .. &amp;quot;:&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        s = s ..        tostring(date.minute) .. &amp;quot;:&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if (date.second &amp;gt;= 0 and date.second &amp;lt; 10) then&lt;br /&gt;
        s = s .. &amp;quot;0&amp;quot; .. tostring(date.second);&lt;br /&gt;
    else&lt;br /&gt;
        s = s ..        tostring(date.second);&lt;br /&gt;
    end&lt;br /&gt;
    return s .. &amp;quot; UTC&amp;quot;;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.yearOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).year;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.monthOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).month;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.dayOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).day;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.weekdayOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).weekday;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.hourOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).hour;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.minuteOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).minute;&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
function this.secondOfJulianDay(JD)&lt;br /&gt;
    -- Check parameters.&lt;br /&gt;
    if JD == nil then&lt;br /&gt;
        return Error.error{&amp;quot;Parameter 1=&amp;#039;&amp;#039;Julian day&amp;#039;&amp;#039; is either missing or has wrong format!&amp;quot;};&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    return this.dateOfJulianDay(JD).second;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
return this;&lt;/div&gt;</summary>
		<author><name>imported&gt;Verdy p</name></author>
	</entry>
</feed>