Module:DateFunctions

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Documentation icon Τεκμηρίωση module[δημιουργία]
-- Διάφορες ημερολογιακές συναρτήσεις
p = {}

--επιστρέφει το κείμενο σε div με σφάλμα
--και εντάσσει τη σελίδα σε κατηγορία με σφάλματα
errorhere = function(errstring)
    return '<div class="error">' .. errstring .. '</div>[[Κατηγορία:Σελίδες με σφάλματα στο ημερολόγιο]]'
end

--επιστρέφει true αν είναι αλφαριθμητικό και έχει έστω και έναν χαρακτήρα
exeikati = function(onearg)
	if onearg == nil then 
		return false 
	end
	if type(onearg) == 'string' then
    	return  (mw.ustring.len(onearg) > 0)
	else
		return false
	end	
end


-- RiciLake comments:
-- It would be better to create the days_in_month table outside the
-- function, like this (using % so it only works in Lua 5.1)
--επιστρέφει το αν είναι δίσεκτο έτος
p.isleapyear = function(poioetos)
    return poioetos % 4 == 0 and (poioetos % 100 ~= 0 or poioetos % 400 == 0)
end

--επιστρέφει τις ημέρες που έχει ο μήνας
----(μήνας και έτος ακέραιοι αριθμοί)
p.getdaysinmonth = function(poiosmhnas, poioetos)
	if poiosmhnas == 2 and p.isleapyear(poioetos) then
      return 29
    else
      return p['μήνες'][poiosmhnas]['ημ']
    end  
end

--επιστρέφει το μήνα (ο μήνας σε ακέραιο) στην ονομαστική πτώση
p.getmonthname = function(poiosmhnas)
	return p['μήνες'][poiosmhnas]['όνομα']
end

--επιστρέφει το μήνα (ο μήνας σε ακέραιο) στη γενική πτώση
p.getmonthgen = function(poiosmhnas)
	return p['μήνες'][poiosmhnas]['γεν']
end

--πίνακας με τα στοιχεία των μηνών
p['μήνες'] = { {['όνομα'] = 'Ιανουάριος', ['γεν'] = 'Ιανουαρίου', ['συντμ'] = {'ΙΑΝ','ΙΑΝ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Φεβρουάριος', ['γεν'] = 'Φεβρουαρίου',['συντμ'] = {'ΦΕΒ','ΦΕΒ.',}, ['ημ'] = 29},
    {['όνομα'] = 'Μάρτιος', ['γεν'] = 'Μαρτίου',['συντμ'] = {'ΜΑΡ','ΜΑΡ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Απρίλιος', ['γεν'] = 'Απριλίου',['συντμ'] = {'ΑΠΡ','ΑΠΡ.',}, ['ημ'] = 30},
    {['όνομα'] = 'Μάιος', ['γεν'] = 'Μαΐου',['συντμ'] = {'ΜΑΙ','ΜΑΙ.','ΜΑΪ','ΜΑΪ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Ιούνιος', ['γεν'] = 'Ιουνίου',['συντμ'] = {'ΙΟΝ','ΙΟΝ.','ΙΟΥΝ','ΙΟΥΝ.',}, ['ημ'] = 30},
    {['όνομα'] = 'Ιούλιος', ['γεν'] = 'Ιουλίου',['συντμ'] = {'ΙΟΛ','ΙΟΛ.','ΙΟΥΛ','ΙΟΥΛ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Αύγουστος', ['γεν'] = 'Αυγούστου',['συντμ'] = {'ΑΥΓ','ΑΥΓ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Σεπτέμβριος', ['γεν'] = 'Σεπτεμβρίου',['συντμ'] = {'ΣΕΠ','ΣΕΠ.',}, ['ημ'] = 30},
    {['όνομα'] = 'Οκτώβριος', ['γεν'] = 'Οκτωβρίου',['συντμ'] = {'ΟΚΤ','ΟΚΤ.',}, ['ημ'] = 31},
    {['όνομα'] = 'Νοέμβριος', ['γεν'] = 'Νοεμβρίου',['συντμ'] = {'ΝΟΕ','ΝΟΕ.',}, ['ημ'] = 30},
    {['όνομα'] = 'Δεκέμβριος', ['γεν'] = 'Δεκεμβρίου',['συντμ'] = {'ΔΕΚ','ΔΕΚ.',}, ['ημ'] = 31},
}

--επιστρέφει τον αριθμό του μήνα από το όνομα ή τη σύντμηση
--από τον πίνακα 
p['μήναςαποόνομα'] = function(month)
    if type(month) ~= "string" then 
        return nil
    end 
    local m = mw.ustring.upper( mw.text.trim(month) )
    for i = 1, 12 do
        if p['μήνες'][i]['όνομα'] == month then return i end
        if p['μήνες'][i]['γεν'] == month then return i end
        local j = 1
        --για όσο υπάρχει σύντμηση για τον μήνα
        while p['μήνες'][i]['συντμ'][j] ~= nil do
           if p['μήνες'][i]['συντμ'][j] == m then
               return i
           end
           j = j + 1
        end
    end
    -- αφού δεν βρέθηκε ως εδώ επιστρέφει αυτόματα το nil
end

--πίνακας με τα ονόματα των ημερών
p['ημέρες'] = { 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο', 'Κυριακή'}

--επιστρέφει το ποια μέρα της εβδομάδας είναι (ακέραιος, Δευτέρα=1) αν δοθεί η ημερομηνία
-- returns the day of week (integer)
-- Compatible with Lua 5.0 and 5.1.
-- from sam_lie 
p.get_day_of_week = function(dd, mm, yy) 
--  local days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
--  local days = { 7, 1, 2, 3, 4, 5, 6 }
 
    local mmx = mm
 
    if (mm == 1) then  mmx = 13; yy = yy-1  end
    if (mm == 2) then  mmx = 14; yy = yy-1  end
 
    local val8 = dd + (mmx*2) +  math.floor(((mmx+1)*3)/5)   + yy + math.floor(yy/4)  - math.floor(yy/100)  + math.floor(yy/400) + 2
    local val9 = math.floor(val8/7)
    local dw = val8-(val9*7) 
 
    if (dw < 2 ) then
        dw = dw + 6
    else
        dw =dw - 1
    end
 
--  return dw, days[dw]
--  return days[dw]
    return dw 
end

--επιστρέφει ένα σωστό αριθμό από το 1 μέχρι το 12
--για την περίπτωση που έχουμε ξεπεράσει (κυκλικά)
--το πάνω ή το κάτω όριο 
--(μία φορά μόνο, δηλαδή από 13-23 ή από -11 μέχρι 0)
p.realmonthnum = function(monthnum)
    if monthnum > 12 then return monthnum - 12 end
    if monthnum < 1 then return monthnum + 12 end  
    return monthnum
end

return p