4 votes

Comment convertir les secondes écoulées depuis l'époque en date et heure actuelles ?

Je sais que j'ai posté cette question il y a un moment, mais j'ai trouvé la solution. J'ai écrit ce code pour un jeu appelé Roblox, mais je le poste ici au cas où quelqu'un d'autre ayant le même problème aurait besoin d'une solution. Quoi qu'il en soit, voici le code :

outputTime = true -- true: will print the current time to output window. false: won't print time
createVariable = true -- true: creates variables under game.Lighting. false: won't create variables

-----------------------------------------------------------------------------------------------
--DO NOT EDIT BELOW----------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------

if(createVariable) then
    yearVar = Instance.new("IntValue", game.Lighting)
    yearVar.Name = "Year"
    yearVar.Value = 0
    monthVar = Instance.new("IntValue", game.Lighting)
    monthVar.Name = "Month"
    monthVar.Value = 0
    dayVar = Instance.new("IntValue", game.Lighting)
    dayVar.Name = "Day"
    dayVar.Value = 0
    hourVar = Instance.new("IntValue", game.Lighting)
    hourVar.Name = "Hour"
    hourVar.Value = 0
    minuteVar = Instance.new("IntValue", game.Lighting)
    minuteVar.Name = "Minute"
    minuteVar.Value = 0
    secondVar = Instance.new("IntValue", game.Lighting)
    secondVar.Name = "Second"
    secondVar.Value = 0
    dayOfWeek = Instance.new("StringValue", game.Lighting)
    dayOfWeek.Name = "DayOfWeek"
    dayOfWeek.Value = "Thursday"
end
function giveZero(data)
    if string.len(data) <= 1 then
        return "0" .. data
    else
        return data
    end
end
function hasDecimal(value)
    if not(value == math.floor(value)) then
        return true
    else
        return false
    end
end
function isLeapYear(year)
    if(not hasDecimal(year / 4)) then
        if(hasDecimal(year / 100)) then
            return true
        else
            if(not hasDecimal(year / 400)) then
                return true
            else
                return false
            end
        end
    else
        return false
    end
end
local eYear = 1970
local timeStampDayOfWeak = 5
local secondsInHour = 3600
local secondsInDay = 86400
local secondsInYear = 31536000
local secondsInLeapYear = 31622400
local monthWith28 = 2419200
local monthWith29 = 2505600
local monthWith30 = 2592000
local monthWith31 = 2678400
local monthsWith30 = {4, 6, 9, 11}
local monthsWith31 = {1, 3, 5, 7, 8, 10, 12}
local daysSinceEpoch = 0
local DOWAssociates = {"Tursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday"}
while(true) do
    now = tick()
    year = 1970
    secs = 0
    daysSinceEpoch = 0
    while((secs + secondsInLeapYear) < now or (secs + secondsInYear) < now) do
        if(isLeapYear(year+1)) then
            if((secs + secondsInLeapYear) < now) then
                secs = secs + secondsInLeapYear
                year = year + 1
                daysSinceEpoch = daysSinceEpoch + 366
            end
        else
            if((secs + secondsInYear) < now) then
                secs = secs + secondsInYear
                year = year + 1
                daysSinceEpoch = daysSinceEpoch + 365
            end
        end
    end
    secondsRemaining = now - secs
    monthSecs = 0
    yearIsLeapYear = isLeapYear(year)
    month = 1 -- January
    while((monthSecs + monthWith28) < secondsRemaining or (monthSecs + monthWith30) < secondsRemaining or (monthSecs + monthWith31) < secondsRemaining) do
        if(month == 1) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 2
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 2) then
            if(not yearIsLeapYear) then
                if((monthSecs + monthWith28) < secondsRemaining) then
                    month = 3
                    monthSecs = monthSecs + monthWith28
                    daysSinceEpoch = daysSinceEpoch + 28
                else
                    break
                end
            else
                if((monthSecs + monthWith29) < secondsRemaining) then
                    month = 3
                    monthSecs = monthSecs + monthWith29
                    daysSinceEpoch = daysSinceEpoch + 29
                else
                    break
                end
            end
        end
        if(month == 3) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 4
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 4) then
            if((monthSecs + monthWith30) < secondsRemaining) then
                month = 5
                monthSecs = monthSecs + monthWith30
                daysSinceEpoch = daysSinceEpoch + 30
            else
                break           
            end
        end
        if(month == 5) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 6
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 6) then
            if((monthSecs + monthWith30) < secondsRemaining) then
                month = 7
                monthSecs = monthSecs + monthWith30
                daysSinceEpoch = daysSinceEpoch + 30
            else
                break
            end
        end
        if(month == 7) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 8
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 8) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 9
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 9) then
            if((monthSecs + monthWith30) < secondsRemaining) then
                month = 10
                monthSecs = monthSecs + monthWith30
                daysSinceEpoch = daysSinceEpoch + 30
            else
                break
            end
        end
        if(month == 10) then
            if((monthSecs + monthWith31) < secondsRemaining) then
                month = 11
                monthSecs = monthSecs + monthWith31
                daysSinceEpoch = daysSinceEpoch + 31
            else
                break
            end
        end
        if(month == 11) then
            if((monthSecs + monthWith30) < secondsRemaining) then
                month = 12
                monthSecs = monthSecs + monthWith30
                daysSinceEpoch = daysSinceEpoch + 30
            else
                break
            end
        end
    end
    day = 1 -- 1st
    daySecs = 0
    daySecsRemaining = secondsRemaining - monthSecs
    while((daySecs + secondsInDay) < daySecsRemaining) do
        day = day + 1
        daySecs = daySecs + secondsInDay
        daysSinceEpoch = daysSinceEpoch + 1
    end
    hour = 0 -- Midnight
    hourSecs = 0
    hourSecsRemaining = daySecsRemaining - daySecs
    while((hourSecs + secondsInHour) < hourSecsRemaining) do
        hour = hour + 1
        hourSecs = hourSecs + secondsInHour
    end
    minute = 0 -- Midnight
    minuteSecs = 0
    minuteSecsRemaining = hourSecsRemaining - hourSecs
    while((minuteSecs + 60) < minuteSecsRemaining) do
        minute = minute + 1
        minuteSecs = minuteSecs + 60
    end
    second = math.floor(now % 60)
    year = giveZero(year)
    month = giveZero(month)
    day = giveZero(day)
    hour = giveZero(hour)
    minute = giveZero(minute)
    second = giveZero(second)
    remanderForDOW = daysSinceEpoch % 7
    DOW = DOWAssociates[remanderForDOW + 1]
    if(createVariable) then
        yearVar.Value = year
        monthVar.Value = month
        dayVar.Value = day
        hourVar.Value = hour
        minuteVar.Value = minute
        secondVar.Value = second
        dayOfWeek.Value = DOW
    end
    if(outputTime) then
        str = "Year: " .. year .. ", Month: " .. month .. ", Day: " .. day .. ", Hour: " .. hour .. ", Minute: " .. minute .. ", Second: ".. second .. ", Day of Week: " .. DOW
        print(str)
    end
    wait(1)
end

----ORIGINAL POST---- Quelles sont les formules pour calculer les éléments suivants sans autre ressource que les secondes depuis l'époque ?

Voici une liste de ce dont j'ai besoin :

Mois de l'année en cours Ex : 7

Jour du mois en cours Ex : 25

Jour de la semaine en cours Ex : jeudi (1-7 serait acceptable)

Heure du jour Ex : 22

Minute actuelle de l'heure Ex : 34

Seconde de la minute en cours : 07

9voto

lhf Points 30556

Voici un peu de code Lua adapté d'un code C trouvé par Google. Il ne gère pas les fuseaux horaires ni l'heure d'été et les sorties se réfèrent donc au temps universel coordonné (UTC).

-- based on http://www.ethernut.de/api/gmtime_8c_source.html

local floor=math.floor

local DSEC=24*60*60 -- secs in a day
local YSEC=365*DSEC -- secs in a year
local LSEC=YSEC+DSEC    -- secs in a leap year
local FSEC=4*YSEC+DSEC  -- secs in a 4-year interval
local BASE_DOW=4    -- 1970-01-01 was a Thursday
local BASE_YEAR=1970    -- 1970 is the base year

local _days={
    -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364
}
local _lpdays={}
for i=1,2  do _lpdays[i]=_days[i]   end
for i=3,13 do _lpdays[i]=_days[i]+1 end

function gmtime(t)
print(os.date("!\n%c\t%j",t),t)
    local y,j,m,d,w,h,n,s
    local mdays=_days
    s=t
    -- First calculate the number of four-year-interval, so calculation
    -- of leap year will be simple. Btw, because 2000 IS a leap year and
    -- 2100 is out of range, this formula is so simple.
    y=floor(s/FSEC)
    s=s-y*FSEC
    y=y*4+BASE_YEAR         -- 1970, 1974, 1978, ...
    if s>=YSEC then
        y=y+1           -- 1971, 1975, 1979,...
        s=s-YSEC
        if s>=YSEC then
            y=y+1       -- 1972, 1976, 1980,... (leap years!)
            s=s-YSEC
            if s>=LSEC then
                y=y+1   -- 1971, 1975, 1979,...
                s=s-LSEC
            else        -- leap year
                mdays=_lpdays
            end
        end
    end
    j=floor(s/DSEC)
    s=s-j*DSEC
    local m=1
    while mdays[m]<j do m=m+1 end
    m=m-1
    local d=j-mdays[m]
    -- Calculate day of week. Sunday is 0
    w=(floor(t/DSEC)+BASE_DOW)%7
    -- Calculate the time of day from the remaining seconds
    h=floor(s/3600)
    s=s-h*3600
    n=floor(s/60)
    s=s-n*60
    print("y","j","m","d","w","h","n","s")
    print(y,j+1,m,d,w,h,n,s)
end

local t=os.time()
gmtime(t)

t=os.time{year=1970, month=1, day=1, hour=0} gmtime(t)
t=os.time{year=1970, month=1, day=3, hour=0} gmtime(t)
t=os.time{year=1970, month=1, day=2, hour=23-3, min=59, sec=59} gmtime(t)

3voto

Vyassa Baratham Points 1407

La formule n'est pas simple pour plusieurs raisons, notamment les années bissextiles. Vous devriez probablement utiliser la formule date fonction sur cette page plutôt que d'essayer de le calculer vous-même.

2voto

daurnimator Points 2084

Vous pouvez utiliser luatz

x = 1234567890
t = require "luatz.timetable".new_from_timestamp ( x )

print(t.year,t.month,t.day,t.hour,t.min,t.sec,t.yday,t.wday)
-- Or just
print(t:rfc_3339())

2voto

januarvs Points 21

Voici comment je procède.

> time0=os.time()
> time0
1571439964
> os.date("%Y%m%d%H%M%S",time0)
20191019120604
>

1voto

Yu Hao Points 40603

os.date est une fonction Lua standard, si l'on passe le premier argument sous forme de "%t" Il renverra un tableau contenant les champs suivants : year (quatre chiffres), month (1--12), day (1--31), hour (0--23), min (0--59), sec (0--61), wday (jour de semaine, le dimanche est 1), yday (jour de l'année), et isdst (drapeau d'heure d'été, un booléen).

Mettez-le à l'épreuve :

time = os.time()
print("time since epoch: " .. time)
date = os.date("*t", time)
print("year: " .. date.year)
print("month: " .. date.month)
print("day: " .. date.day)
print("hour: " .. date.hour)
print("minute: " .. date.min)
print("second: " .. date.sec)
print("weekday: " .. date.wday)

Sortie :

time since epoch: 1374826427
year: 2013
month: 7
day: 26
hour: 16
minute: 13
second: 47
weekday: 6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X