Editing Module:D'ni Time

From Guild of Archivists
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
-- THIS IS OBVIOUSLY NOT DONE! DO NOT TOUCH! -Vee
dnitools = require("Module:D'ni Tools")
dnifunc = require("Module:D'ni Time/dni")
surfacefunc = require("Module:D'ni Time/surface")
Date = require('Module:Date')._Date
local p = {}
local p = {}


Line 12: Line 4:
local origArgs
local origArgs
local root
local root
-- Declare important constants
local refDniHahr = 9647
local msPerHahr = 31556925216
local prorahnteePerHahr = 10 * 29 * 5 * 25 * 25 * 25
local msPerProrahn = msPerHahr / prorahnteePerHahr
local refProrahnteePerHahr = 9647 * 290 * 5 * 25 * 25 * 25


local leapSecTimeStamps = {2272060800, 2287785600, 2303683200, 2335219200, 2366755200, 2398291200, 2429913600, 2461449600, 2492985600, 2524521600, 2571782400, 2603318400, 2634854400, 2698012800, 2776982400, 2840140800, 2871676800, 2918937600, 2950473600, 2982009600, 3029443200, 3076704000, 3124137600, 3345062400, 3439756800, 3550089600, 3644697600, 3692217600}
local leapSecTimeStamps = {2272060800, 2287785600, 2303683200, 2335219200, 2366755200, 2398291200, 2429913600, 2461449600, 2492985600, 2524521600, 2571782400, 2603318400, 2634854400, 2698012800, 2776982400, 2840140800, 2871676800, 2918937600, 2950473600, 2982009600, 3029443200, 3076704000, 3124137600, 3345062400, 3439756800, 3550089600, 3644697600, 3692217600}
local LeapSecOffset = 10
local LeapSecOffset = 10


local function ConvertLeapSecTimeStamps()
local function ConvertLeapSecTimeStamps()
-- convert LeapSecTimeStamps from NTP epoch (number of seconds since 1900-01-01 00:00:00)
-- to Unix standard (number of milliseconds since 1970-01-01 00:00:00)
   delta = os.time({year=1900, month=1, day=1, hour=0, min=0})
   delta = os.time({year=1900, month=1, day=1, hour=0, min=0})
   for key,value in pairs(leapSecTimeStamps) do
   for key,value in pairs(leapSecTimeStamps) do
Line 34: Line 17:


local function AdjustForLeapSeconds(timestamp)
local function AdjustForLeapSeconds(timestamp)
-- Adjust timestamp for leap seconds
   leapsecs = 0
   leapsecs = 0
   for key,value in pairs(leapSecTimeStamps) do
   for key,value in pairs(leapSecTimeStamps) do
Line 48: Line 30:


local function DejustForLeapSeconds(timestamp)
local function DejustForLeapSeconds(timestamp)
-- Adjust timestamp for leap seconds the other way
   leapsecs = 0
   leapsecs = 0
   for key,value in pairs(leapSecTimeStamps) do
   for key,value in pairs(leapSecTimeStamps) do
       if timestamp >= value then
       if timestamp >= value then
         leapsecs = leapsecs + 1
         leapsecs = leapsecs - 1
       end
       end
   end
   end
Line 62: Line 43:


local function makeSurfaceTimeStamp(timeStampTable)
local function makeSurfaceTimeStamp(timeStampTable)
-- convert a UTC date-time to a adjusted timestamp
   temp = os.time(timeStampTable)
   temp = os.time(timeStampTable)
--  return temp
   return AdjustForLeapSeconds(temp)
   return AdjustForLeapSeconds(temp)
end
end


-- Run conversion of leapseconds and conversion of reference Timestamp here,
ConvertLeapSecTimeStamps()
-- since these require the above functions to be already declared


ConvertLeapSecTimeStamps()
local refTimeStampPre = os.time({year=1991, month=4, day=21, hour=16, min=54})
local refTimeStamp = makeSurfaceTimeStamp({year=1991, month=4, day=21, hour=16, min=54})
local refTimeStamp = makeSurfaceTimeStamp({year=1991, month=4, day=21, hour=16, min=54})
local refDniHahr = 9647
local msPerHahr = 31556925216
local prorahnteePerHahr = 10 * 29 * 5 * 25 * 25 * 25
local msPerProrahn = msPerHahr / prorahnteePerHahr
local refProrahnteePerHahr = 9647 * 290 * 5 * 25 * 25 * 25


local function adjust(dniTime)
-- Ensure DniTime values are within bounds
        while (dniTime['prorahn'] > 25) do
            dniTime['prorahn'] = dniTime['prorahn'] - 25
            dniTime['gorahn'] = dniTime['gorahn'] + 1
        end


        while (dniTime['prorahn'] < 0) do
local function displaySurfaceTime(surface)
            dniTime['prorahn'] = dniTime['prorahn'] + 25
            dniTime['gorahn'] = dniTime['gorahn'] - 1
        end


        while (dniTime['gorahn'] > 25) do
--  surface = os.date("*t",time)
            dniTime['gorahn'] = dniTime['gorahn'] - 25;
  return '{'..'year = '..surface['year']..', month = '..surface['month']..', day = '..surface['day']..', hour = '..surface['hour']..', min = '..surface['min']..', sec = '..surface['sec']..'}'
            dniTime['tahvo'] = dniTime['tahvo'] + 1;
        end


        while (dniTime['gorahn'] < 0) do
-- isdst = '..surface['isdst'].toString()..'}'
            dniTime['gorahn'] = dniTime['gorahn'] + 25
end
            dniTime['tahvo'] = dniTime['tahvo'] - 1
        end
 
        while (dniTime['tahvo'] > 25) do
            dniTime['tahvo'] = dniTime['tahvo'] - 25
            dniTime['gahrtahvo'] = dniTime['gahrtahvo'] + 1
        end
 
        while (dniTime['tahvo'] < 0) do
            dniTime['tahvo'] = dniTime['tahvo'] + 25
            dniTime['gahrtahvo'] = dniTime['gahrtahvo'] - 1
        end
 
        while (dniTime['gahrtahvo'] > 5) do
            dniTime['gahrtahvo'] = dniTime['gahrtahvo'] - 5
            dniTime['yahr'] = dniTime['yahr'] + 1
        end
 
        while (dniTime['gahrtahvo'] < 0) do
            dniTime['gahrtahvo'] = dniTime['gahrtahvo'] + 5
            dniTime['yahr'] = dniTime['yahr'] - 1
        end
 
        while (dniTime['yahr'] > 29) do
            dniTime['yahr'] = dniTime['yahr'] - 29
            dniTime['vailee'] = dniTime['vailee'] + 1
        end
 
        while (dniTime['yahr'] < 0) do
            dniTime['yahr'] = dniTime['yahr'] + 29
            dniTime['vailee'] = dniTime['vailee'] - 1
        end


        while (dniTime['vailee'] > 9) do
local function displayDniTime(dniTime)
            dniTime['vailee'] = dniTime['vailee'] - 10
  return '{'..'hahr = '..dniTime['hahr']..', vailee = '..dniTime['vailee']..', yahr = '..dniTime['yahr']..', gartahvo = '..dniTime['gartahvo']..', tahvo = '..dniTime['tahvo']..', gorahn = '..dniTime['gorahn']..', prorahn = '..dniTime['prorahn']..'}'
            dniTime['hahr'] = dniTime['hahr'] + 1;
        end


        while (dniTime['vailee'] < 0) do
-- isdst = '..surface['isdst'].toString()..'}'
            dniTime['vailee'] = dniTime['vailee'] + 10
            dniTime['hahr'] = dniTime['hahr'] - 1
        end
 
        return dniTime
end
end


local function surface2DniTime(surface)


local function surface2DniTime(surfaceTimeStamp)
   dniTime = {}
-- Given a surfaceTimestamp
-- Return a DniTime (table)
   surface = surface or refTimeStamp


   dniTime = {}
   surfaceTimeStamp = makeSurfaceTimeStamp(surface)


   delta = (surfaceTimeStamp - refTimeStamp) * 1000
   delta = (surfaceTimeStamp - refTimeStamp) * 1000
Line 160: Line 93:
   delta = delta - (dniTime['yahr'] * (5 * 25 * 25 * 25))
   delta = delta - (dniTime['yahr'] * (5 * 25 * 25 * 25))


   dniTime['gahrtahvo'] = math.floor(delta / (25 * 25 * 25))
   dniTime['gartahvo'] = math.floor(delta / (25 * 25 * 25))
   delta = delta - (dniTime['gahrtahvo'] * (25 * 25 * 25))
   delta = delta - (dniTime['gartahvo'] * (25 * 25 * 25))


   dniTime['tahvo'] = math.floor(delta / (25 * 25))
   dniTime['tahvo'] = math.floor(delta / (25 * 25))
Line 174: Line 107:
   dniTime['yahr'] = dniTime['yahr'] + 1
   dniTime['yahr'] = dniTime['yahr'] + 1


  --return adjust(dniTime)
   return dniTime
   return dniTime
end
end


local function dni2SurfaceTime(dniTime)
local function dni2SurfaceTime(dniTime)
-- Given a DniTime (table)
-- Return a surfacteTimestamp
  dniTime = dniTime or {hahr = refDniHahr, vailee = 0, yahr = 1, gahrtahvo = 0, tahvo = 0, gorahn = 0, prorahn = 0}
  dniTime = adjust(dniTime)


   dTimeInProrahntee = dniTime['prorahn'] + (dniTime['gorahn'] * 25) + (dniTime['tahvo'] * 25 * 25) + (dniTime['gahrtahvo'] * 25 * 25 * 25) + ((dniTime['yahr'] - 1) * 5 * 25 * 25 * 25) + ((dniTime['vailee']) * 29 * 5 * 25 * 25 * 25) + (dniTime['hahr'] * 290 * 5 * 25 * 25 * 25)
   dTimeInProrahntee = dniTime['prorahn'] + (dniTime['gorahn'] * 25) + (dniTime['tahvo'] * 25 * 25) + (dniTime['gartahvo'] * 25 * 25 * 25) + ((dniTime['yahr'] - 1) * 5 * 25 * 25 * 25) + ((dniTime['vailee']) * 29 * 5 * 25 * 25 * 25) + (dniTime['hahr'] * 290 * 5 * 25 * 25 * 25)


   dTimeDelta = refProrahnteePerHahr - dTimeInProrahntee  
   dTimeDelta = refProrahnteePerHahr - dTimeInProrahntee  
Line 197: Line 124:
   return os.date("*t",surfaceTimestamp)
   return os.date("*t",surfaceTimestamp)
end
end
-- =============================================================================


local function preprocessSingleArg(argName)
local function preprocessSingleArg(argName)
Line 208: Line 133:
end
end


function p.surface2dni(frame)
local function preprocessArgs(prefixTable, step)
     -- If called via #invoke, use the args passed into the invoking template.
     -- Assign the parameters with the given prefixes to the args table, in order, in batches
     -- Otherwise, for testing purposes, assume args are being passed directly in.
    -- of the step size specified. This is to prevent references etc. from appearing in the
     if frame == mw.getCurrentFrame() then
    -- wrong order. The prefixTable should be an array containing tables, each of which has
         origArgs = frame:getParent().args
     -- two possible fields, a "prefix" string and a "depend" table. The function always parses
     else
    -- parameters containing the "prefix" string, but only parses parameters in the "depend"
         origArgs = frame
    -- table if the prefix parameter is present and non-blank.
     if type(prefixTable) ~= 'table' then
         error("Non-table value detected for the prefix table", 2)
     end
    if type(step) ~= 'number' then
         error("Invalid step value detected", 2)
     end
     end
    output = ""
      
      
     preprocessSingleArg('datetime')
     -- Get arguments without a number suffix, and check for bad input.
     preprocessSingleArg('format')
     for i,v in ipairs(prefixTable) do
    preprocessSingleArg('input')
        if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
   
            error('Invalid input detected to preprocessArgs prefix table', 2)
    if args['datetime'] then
        end
      surfaceTime = surfacefunc.parseSurfaceDateStr(args['datetime'],args['input'])
        preprocessSingleArg(v.prefix)
      output = dnifunc.formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surfaceTime)),args['format'])
        -- Only parse the depend parameter if the prefix parameter is present and not blank.
    else
        if args[v.prefix] and v.depend then
      preprocessSingleArg('year')
            for j, dependValue in ipairs(v.depend) do
      preprocessSingleArg('month') 
                if type(dependValue) ~= 'string' then
      preprocessSingleArg('day')  
                    error('Invalid "depend" parameter value detected in preprocessArgs')
      preprocessSingleArg('hour')
                end
      preprocessSingleArg('minute')
                preprocessSingleArg(dependValue)
      preprocessSingleArg('second')
            end
 
         end
      -- Parse the data parameters
      surface = {year = args['year'], month = args['month'] or 1, day = args['day'] or 1, hour = args['hour'] or 0, min = args['minute'] or 0, sec = args['second'] or 0}
 
---      output =  dnifunc.displayDniTime(surface2DniTime(makeSurfaceTimeStamp(surface)),args['format'])
      output = dnifunc.formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surface)),args['format'])
    end
    return output
end
 
function p.dni2surface(frame)
    -- If called via #invoke, use the args passed into the invoking template.
    -- Otherwise, for testing purposes, assume args are being passed directly in.
    if frame == mw.getCurrentFrame() then
         origArgs = frame:getParent().args
    else
        origArgs = frame
     end
     end


     preprocessSingleArg('datetime')
     -- Get arguments with number suffixes.
     preprocessSingleArg('format')
     local a = 1 -- Counter variable.
     preprocessSingleArg('input')
     local moreArgumentsExist = true
 
    while moreArgumentsExist == true do
    if args['datetime'] then
        moreArgumentsExist = false
      output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dnifunc.parseDniDateStr(args['datetime'],args['input'])),args['format'])
        for i = a, a + step - 1 do
    else
            for j,v in ipairs(prefixTable) do
      preprocessSingleArg('hahr')
                local prefixArgName = v.prefix .. tostring(i)
      preprocessSingleArg('vailee')
                if origArgs[prefixArgName] then
      preprocessSingleArg('yahr')
                    moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
      preprocessSingleArg('gahrtahvo')
                    preprocessSingleArg(prefixArgName)
      preprocessSingleArg('tahvo')  
                end
      preprocessSingleArg('gorahn')
                -- Process the depend table if the prefix argument is present and not blank, or
      preprocessSingleArg('prorahn')
                -- we are processing "prefix1" and "prefix" is present and not blank, and
 
                -- if the depend table is present.
      -- Parse the data parameters
                if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
      dni = {hahr = tonumber(args['hahr']), vailee = tonumber(args['vailee']), yahr = tonumber(args['yahr']), gahrtahvo = tonumber(args['gahrtahvo']), tahvo = tonumber(args['tahvo']), gorahn = tonumber(args['gorahn']), prorahn = tonumber(args['prorahn'])}
                    for j,dependValue in ipairs(v.depend) do
 
                        local dependArgName = dependValue .. tostring(i)
--      output = surfacefunc.displaySurfaceTime(dni2SurfaceTime(dni),args['format'])
                        preprocessSingleArg(dependArgName)
      output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dni),args['format'])
                    end
                end
            end
        end
        a = a + step
     end
     end
   
    return output
end
end


Line 289: Line 202:
     -- Parse the data parameters
     -- Parse the data parameters
      
      
    lang = mw.getContentLanguage()


     surface = {year = -7658, month = 5, day = 31, hour = 6, min = 56, sec = 58, isdst = true}
     output = os.time({year=1900, month=1, day=1, hour=0, min=0}) .. "<br/>" .. refTimeStampPre .. "<br/>" .. refTimeStamp .."<br/>" .. displaySurfaceTime(os.date("*t",refTimeStamp))
     dni = {hahr = -1, vailee = 1, yahr = 1, gahrtahvo = 1, tahvo = 1, gorahn = 1, prorahn = 1}
    output = output .. "<br/>" .. displaySurfaceTime(os.date("*t",63100800)) .. "<br/>"
    output = output .. displayDniTime(surface2DniTime({year=2020, month=7, day=29, hour=16, min=0})).."<br/>---"
     output = output .. displaySurfaceTime(dni2SurfaceTime({hahr = 9676, vailee = 2, yahr = 22, gartahvo = 1, tahvo = 18, gorahn = 21, prorahn = 24})).."<br/>---"


    output = ""
    output = output .. "<br/>"..surfacefunc.displaySurfaceTime(surface)
--    output = output .. "<br/>"..dnifunc.displayDniTime(surface2DniTime(makeSurfaceTimeStamp(surface)))
--    output = output .. "<br/>"..dnifunc.formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surface)))
    output = output .. "<br/>"..dnifunc.displayDniTime(dni)
    output = output .. "<br/>"..surfacefunc.displaySurfaceTime(dni2SurfaceTime(dni))
    output = output .. "<br/>"..os.date("ghdd",makeSurfaceTimeStamp(surface))
--    output = output .. "<br/>"..surfacefunc.formatSurfaceTime(surface,args['format'])
--    output = output .. "<br/>"..makeSurfaceTimeStamp(surface)
--    output = output .. "<br/>"..lang:formatDate("c","@"..makeSurfaceTimeStamp(surface))




Please note that all contributions to Guild of Archivists may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see GoArch:Copyrights for details). Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: