Difference between revisions of "Module:D'ni Time"

m
m
 
(269 intermediate revisions by 2 users not shown)
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 5: Line 13:
 
local root
 
local root
  
local refTimeStamp = os.time({year=1991, month=4, day=21, hour=16, min=54})
+
-- Declare important constants
 
local refDniHahr = 9647
 
local refDniHahr = 9647
 
local msPerHahr = 31556925216
 
local msPerHahr = 31556925216
Line 13: Line 21:
  
 
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
  
ConvertLeapSecTimeStamps()  
+
local function ConvertLeapSecTimeStamps()
 
+
-- convert LeapSecTimeStamps from NTP epoch (number of seconds since 1900-01-01 00:00:00)
local foo = ''
+
-- to Unix standard (number of milliseconds since 1970-01-01 00:00:00)
  
local function ConvertLeapSecTimeStamps()
 
 
   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
 
       leapSecTimeStamps[key] = value + delta
 
       leapSecTimeStamps[key] = value + delta
 
   end
 
   end
 +
end
 +
 +
local function AdjustForLeapSeconds(timestamp)
 +
-- Adjust timestamp for leap seconds
 +
  leapsecs = 0
 
   for key,value in pairs(leapSecTimeStamps) do
 
   for key,value in pairs(leapSecTimeStamps) do
       foo = foo .. ',' .. value
+
       if timestamp >= value then
 +
        leapsecs = leapsecs + 1
 +
      end
 
   end
 
   end
-return leapSecTimeStamps
+
  if leapsecs > 0 then
 +
      leapsecs = leapsecs + (LeapSecOffset - 1)
 +
  end
 +
  return timestamp + leapsecs
 
end
 
end
  
 +
local function DejustForLeapSeconds(timestamp)
 +
-- Adjust timestamp for leap seconds the other way
 +
  leapsecs = 0
 +
  for key,value in pairs(leapSecTimeStamps) do
 +
      if timestamp >= value then
 +
        leapsecs = leapsecs + 1
 +
      end
 +
  end
 +
  if leapsecs > 0 then
 +
      leapsecs = leapsecs + (LeapSecOffset - 1)
 +
  end
 +
  return timestamp - leapsecs
 +
end
  
 +
local function makeSurfaceTimeStamp(timeStampTable)
 +
-- convert a UTC date-time to a adjusted timestamp
 +
  temp = os.time(timeStampTable)
 +
  return AdjustForLeapSeconds(temp)
 +
end
 +
 +
-- Run conversion of leapseconds and conversion of reference Timestamp here,
 +
-- since these require the above functions to be already declared
 +
 +
ConvertLeapSecTimeStamps()
 +
local refTimeStamp = makeSurfaceTimeStamp({year=1991, month=4, day=21, hour=16, min=54})
 +
 +
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
  
-- local convertedLeapSecTimeStamps = ConvertLeapSecTimeStamps()
+
        while (dniTime['prorahn'] < 0) do
local LeapSecOffset = 10
+
            dniTime['prorahn'] = dniTime['prorahn'] + 25
 +
            dniTime['gorahn'] = dniTime['gorahn'] - 1
 +
        end
 +
 
 +
        while (dniTime['gorahn'] > 25) do
 +
            dniTime['gorahn'] = dniTime['gorahn'] - 25;
 +
            dniTime['tahvo'] = dniTime['tahvo'] + 1;
 +
        end
 +
 
 +
        while (dniTime['gorahn'] < 0) do
 +
            dniTime['gorahn'] = dniTime['gorahn'] + 25
 +
            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
 +
            dniTime['vailee'] = dniTime['vailee'] - 10
 +
            dniTime['hahr'] = dniTime['hahr'] + 1;
 +
        end
 +
 
 +
        while (dniTime['vailee'] < 0) do
 +
            dniTime['vailee'] = dniTime['vailee'] + 10
 +
            dniTime['hahr'] = dniTime['hahr'] - 1
 +
        end
 +
 
 +
        return dniTime
 +
end
 +
 
 +
 
 +
local function surface2DniTime(surfaceTimeStamp)
 +
-- Given a surfaceTimestamp
 +
-- Return a DniTime (table)
 +
  surface = surface or refTimeStamp
 +
 
 +
  dniTime = {}
 +
 
 +
  delta = (surfaceTimeStamp - refTimeStamp) * 1000
 +
 
 +
  dniTime['hahr'] = math.floor(delta / msPerHahr)
 +
 
 +
  delta = delta - (dniTime['hahr'] * msPerHahr)
 +
 
 +
  delta = delta * (prorahnteePerHahr / msPerHahr)
 +
 
 +
  dniTime['vailee'] = math.floor(delta / (29 * 5 * 25 * 25 * 25))
 +
  delta = delta - (dniTime['vailee'] * (29 * 5 * 25 * 25 * 25))
 +
 
 +
  dniTime['yahr'] = math.floor(delta / (5 * 25 * 25 * 25))
 +
  delta = delta - (dniTime['yahr'] * (5 * 25 * 25 * 25))
 +
 
 +
  dniTime['gahrtahvo'] = math.floor(delta / (25 * 25 * 25))
 +
  delta = delta - (dniTime['gahrtahvo'] * (25 * 25 * 25))
 +
 
 +
  dniTime['tahvo'] = math.floor(delta / (25 * 25))
 +
  delta = delta - (dniTime['tahvo'] * (25 * 25))
 +
 
 +
  dniTime['gorahn'] = math.floor(delta / 25)
 +
  delta = delta - (dniTime['gorahn'] * 25)
  
 +
  dniTime['prorahn'] = math.floor(delta)
  
local function displaySurfaceTime(time)
+
   dniTime['hahr'] = dniTime['hahr'] + refDniHahr
   surface = os.date("*t",time)
+
  dniTime['yahr'] = dniTime['yahr'] + 1
  return '{'..'year = '..surface['year']..', month = '..surface['month']..', day = '..surface['day']..', hour = '..surface['hour']..', min = '..surface['min']..', sec = '..surface['sec']..'}'
 
  
-- isdst = '..surface['isdst'].toString()..'}'
+
  --return adjust(dniTime)
 +
  return dniTime
 
end
 
end
  
 +
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)
 +
 +
  dTimeDelta = refProrahnteePerHahr - dTimeInProrahntee
 +
 
 +
  dTimeDelta = dTimeDelta * msPerProrahn
 +
 +
  dTimeDelta = (refTimeStamp * 1000) - dTimeDelta
 +
 +
  surfaceTimestamp = DejustForLeapSeconds(dTimeDelta/1000)
 +
 +
  return os.date("*t",surfaceTimestamp)
 +
end
  
 +
-- =============================================================================
  
 
local function preprocessSingleArg(argName)
 
local function preprocessSingleArg(argName)
Line 52: Line 208:
 
end
 
end
  
local function preprocessArgs(prefixTable, step)
+
function p.surface2dni(frame)
     -- Assign the parameters with the given prefixes to the args table, in order, in batches
+
     -- If called via #invoke, use the args passed into the invoking template.
    -- of the step size specified. This is to prevent references etc. from appearing in the
+
     -- Otherwise, for testing purposes, assume args are being passed directly in.
     -- wrong order. The prefixTable should be an array containing tables, each of which has
+
     if frame == mw.getCurrentFrame() then
    -- two possible fields, a "prefix" string and a "depend" table. The function always parses
+
         origArgs = frame:getParent().args
     -- parameters containing the "prefix" string, but only parses parameters in the "depend"
+
     else
    -- table if the prefix parameter is present and non-blank.
+
        origArgs = frame
    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')
 +
    preprocessSingleArg('format')
 +
    preprocessSingleArg('input')
 
      
 
      
     -- Get arguments without a number suffix, and check for bad input.
+
     if args['datetime'] then
     for i,v in ipairs(prefixTable) do
+
      surfaceTime = surfacefunc.parseSurfaceDateStr(args['datetime'],args['input'])
        if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
+
      output = dnifunc.formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surfaceTime)),args['format'])
            error('Invalid input detected to preprocessArgs prefix table', 2)
+
     else
        end
+
      preprocessSingleArg('year')
        preprocessSingleArg(v.prefix)
+
      preprocessSingleArg('month') 
        -- Only parse the depend parameter if the prefix parameter is present and not blank.
+
      preprocessSingleArg('day')
        if args[v.prefix] and v.depend then
+
      preprocessSingleArg('hour')
            for j, dependValue in ipairs(v.depend) do
+
      preprocessSingleArg('minute')  
                if type(dependValue) ~= 'string' then
+
      preprocessSingleArg('second')  
                    error('Invalid "depend" parameter value detected in preprocessArgs')
+
 
                end
+
      -- Parse the data parameters
                preprocessSingleArg(dependValue)
+
      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}
            end
+
 
         end
+
---      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
  
     -- Get arguments with number suffixes.
+
     preprocessSingleArg('datetime')
     local a = 1 -- Counter variable.
+
     preprocessSingleArg('format')
     local moreArgumentsExist = true
+
     preprocessSingleArg('input')
     while moreArgumentsExist == true do
+
 
        moreArgumentsExist = false
+
     if args['datetime'] then
        for i = a, a + step - 1 do
+
      output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dnifunc.parseDniDateStr(args['datetime'],args['input'])),args['format'])
            for j,v in ipairs(prefixTable) do
+
    else
                local prefixArgName = v.prefix .. tostring(i)
+
      preprocessSingleArg('hahr')
                if origArgs[prefixArgName] then
+
      preprocessSingleArg('vailee')
                    moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
+
      preprocessSingleArg('yahr')
                    preprocessSingleArg(prefixArgName)
+
      preprocessSingleArg('gahrtahvo')
                end
+
      preprocessSingleArg('tahvo')  
                -- Process the depend table if the prefix argument is present and not blank, or
+
      preprocessSingleArg('gorahn')
                -- we are processing "prefix1" and "prefix" is present and not blank, and
+
      preprocessSingleArg('prorahn')
                -- if the depend table is present.
+
 
                if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
+
      -- Parse the data parameters
                    for j,dependValue in ipairs(v.depend) do
+
      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'])}
                        local dependArgName = dependValue .. tostring(i)
+
 
                        preprocessSingleArg(dependArgName)
+
--      output = surfacefunc.displaySurfaceTime(dni2SurfaceTime(dni),args['format'])
                    end
+
      output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dni),args['format'])
                end
 
            end
 
        end
 
        a = a + step
 
 
     end
 
     end
 +
   
 +
    return output
 +
 
end
 
end
  
Line 121: Line 289:
 
     -- 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}
 +
    dni = {hahr = -1, vailee = 1, yahr = 1, gahrtahvo = 1, tahvo = 1, gorahn = 1, prorahn = 1}
 +
 +
    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))
  
    output = os.time({year=1900, month=1, day=1, hour=0, min=0}) .. "<br/>" .. refTimeStamp .. "<br/>" .. displaySurfaceTime(refTimeStamp)
 
    output = output .. "<br/>" .. displaySurfaceTime(63100800) .. "<br/>" ..foo .. "<br/>---"
 
  
 
     return output
 
     return output

Latest revision as of 04:32, 18 August 2020

Documentation for this module may be created at Module:D'ni Time/doc

-- 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 args = {}
local origArgs
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 LeapSecOffset = 10

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})
   for key,value in pairs(leapSecTimeStamps) do
      leapSecTimeStamps[key] = value + delta
   end
end

local function AdjustForLeapSeconds(timestamp)
-- Adjust timestamp for leap seconds
   leapsecs = 0
   for key,value in pairs(leapSecTimeStamps) do
      if timestamp >= value then
         leapsecs = leapsecs + 1
      end
   end
   if leapsecs > 0 then
      leapsecs = leapsecs + (LeapSecOffset - 1)
   end 
   return timestamp + leapsecs
end

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

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

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

ConvertLeapSecTimeStamps()
local refTimeStamp = makeSurfaceTimeStamp({year=1991, month=4, day=21, hour=16, min=54})

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
            dniTime['prorahn'] = dniTime['prorahn'] + 25
            dniTime['gorahn'] = dniTime['gorahn'] - 1
        end

        while (dniTime['gorahn'] > 25) do
            dniTime['gorahn'] = dniTime['gorahn'] - 25;
            dniTime['tahvo'] = dniTime['tahvo'] + 1;
        end

        while (dniTime['gorahn'] < 0) do
            dniTime['gorahn'] = dniTime['gorahn'] + 25
            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
            dniTime['vailee'] = dniTime['vailee'] - 10
            dniTime['hahr'] = dniTime['hahr'] + 1;
        end

        while (dniTime['vailee'] < 0) do
            dniTime['vailee'] = dniTime['vailee'] + 10
            dniTime['hahr'] = dniTime['hahr'] - 1
        end

        return dniTime
end


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

   dniTime = {}

   delta = (surfaceTimeStamp - refTimeStamp) * 1000

   dniTime['hahr'] = math.floor(delta / msPerHahr)

   delta = delta - (dniTime['hahr'] * msPerHahr)

   delta = delta * (prorahnteePerHahr / msPerHahr)

   dniTime['vailee'] = math.floor(delta / (29 * 5 * 25 * 25 * 25))
   delta = delta - (dniTime['vailee'] * (29 * 5 * 25 * 25 * 25))

   dniTime['yahr'] = math.floor(delta / (5 * 25 * 25 * 25))
   delta = delta - (dniTime['yahr'] * (5 * 25 * 25 * 25))

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

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

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

   dniTime['prorahn'] = math.floor(delta)

   dniTime['hahr'] = dniTime['hahr'] + refDniHahr
   dniTime['yahr'] = dniTime['yahr'] + 1

   --return adjust(dniTime)
   return dniTime
end

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)

   dTimeDelta = refProrahnteePerHahr - dTimeInProrahntee 
   
   dTimeDelta = dTimeDelta * msPerProrahn

   dTimeDelta = (refTimeStamp * 1000) - dTimeDelta

   surfaceTimestamp = DejustForLeapSeconds(dTimeDelta/1000)

   return os.date("*t",surfaceTimestamp)
end

-- =============================================================================

local function preprocessSingleArg(argName)
    -- If the argument exists and isn't blank, add it to the argument table.
    -- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
    if origArgs[argName] and origArgs[argName] ~= '' then
        args[argName] = origArgs[argName]
    end
end

function p.surface2dni(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

    output = ""
    
    preprocessSingleArg('datetime')
    preprocessSingleArg('format')
    preprocessSingleArg('input')
    
    if args['datetime'] then
       surfaceTime = surfacefunc.parseSurfaceDateStr(args['datetime'],args['input'])
       output = dnifunc.formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surfaceTime)),args['format'])
    else 
       preprocessSingleArg('year')
       preprocessSingleArg('month')  
       preprocessSingleArg('day') 
       preprocessSingleArg('hour') 
       preprocessSingleArg('minute') 
       preprocessSingleArg('second') 

       -- 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

    preprocessSingleArg('datetime')
    preprocessSingleArg('format')
    preprocessSingleArg('input')

    if args['datetime'] then
       output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dnifunc.parseDniDateStr(args['datetime'],args['input'])),args['format'])
    else 
      preprocessSingleArg('hahr')
      preprocessSingleArg('vailee')  
      preprocessSingleArg('yahr') 
      preprocessSingleArg('gahrtahvo') 
      preprocessSingleArg('tahvo') 
      preprocessSingleArg('gorahn')
      preprocessSingleArg('prorahn') 

      -- Parse the data parameters
      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'])}

--      output = surfacefunc.displaySurfaceTime(dni2SurfaceTime(dni),args['format'])
      output = surfacefunc.formatSurfaceTime(dni2SurfaceTime(dni),args['format'])
    end
    
    return output

end

function p.test(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
    
    -- Parse the data parameters
    
    lang = mw.getContentLanguage()

    surface = {year = -7658, month = 5, day = 31, hour = 6, min = 56, sec = 58, isdst = true}
    dni = {hahr = -1, vailee = 1, yahr = 1, gahrtahvo = 1, tahvo = 1, gorahn = 1, prorahn = 1}

    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))


    return output
end

return p