Avatar billede para7 Nybegynder
25. oktober 2012 - 18:32 Der er 9 kommentarer og
2 løsninger

Seconds to time funktion

Jegf har lavet en funktion, som virker, men den giver forkert ved indput af sekunder på 4 eller 2 eller 1, hvor output bliver fx 08:00.

Nogen der ved hvad er galt. Man ka sikert lave en smartere funktion...

Function SecondsToTime(ByVal SecondsX)
    secondsToTime0 = SecondsX/60
    If InStr(secondsToTime0,",") Then
        secondsToTimeMinutePart0 = left(secondsToTime0,InStr(secondsToTime0,",")-1)
    Else
        secondsToTimeMinutePart0 = secondsToTime0
    End If
    If Len(secondsToTimeMinutePart0) = 1 Then
        secondsToTimeMinutePart = "0" & secondsToTimeMinutePart0
    Else
        secondsToTimeMinutePart = secondsToTimeMinutePart0
    End If
    If InStr(secondsToTime0,",") Then
        secondsToTimeSecondPart0 = mid(secondsToTime0,InStr(secondsToTime0,",")+1)
    Else
        secondsToTimeSecondPart0 ="00"
    End If
    secondsToTimeSecondPart0 = ("0," & secondsToTimeSecondPart0)*60
    secondsToTimeSecondPart0 = Round(secondsToTimeSecondPart0)
    If Len(secondsToTimeSecondPart0) = 1 Then
        secondsToTimeSecondPart = "0" & secondsToTimeSecondPart0
    Else
        secondsToTimeSecondPart = secondsToTimeSecondPart0
    End If
    SecondsToTime = secondsToTimeMinutePart & ":" & secondsToTimeSecondPart
End Function
Avatar billede jetobi Juniormester
25. oktober 2012 - 19:36 #1
Hej para7. forstår ikke rigtig hvad du mener, altså hvad er fejlen præsics? fordi koden virkede nu ved mig :-)

Mvh jesper
Avatar billede softspot Forsker
25. oktober 2012 - 20:17 #2
Kan du ikke prøve at lave nogle eksempler på kald der fejler, for det er lidt uklart hvad problemet er...?
Avatar billede softspot Forsker
25. oktober 2012 - 20:37 #3
Alternativt prøv med denne funktion i stedet:

function sec2time(secs)
  dim sTime, rest
  sTime = ""

  if secs > 0 then
    rest = secs
    do while rest > 0 and len(sTime) < 6
      if len(sTime) > 0 then sTime = ":" & sTime
      sTime = right("00" & (rest mod 60), 2) & sTime
      rest = rest / 60
    loop
  else
    sTime = "00:00:00"
  end if

  sec2time = sTime
end function

Du kan teste den med dette kode:

arrSecs = array(0,1,2,4,11,60,124,1500,10000)

for each secs in arrSecs

  Response.write secs & " seconds => time " & sec2time(secs) & "<br>"

next
Avatar billede para7 Nybegynder
26. oktober 2012 - 09:07 #4
Tak softspot
Den virker som den skal. Min funktion kunne ikek håndtere nogle af de små sekunder, af hvad grund, er ikke så vigtigt nu.
Smid lige svar for point...
Avatar billede softspot Forsker
26. oktober 2012 - 09:24 #5
Velbekomme :-)

Vær dog opmærksom på, at min funktion ikke er bagt helt færdig, da den også dividere timer med 60, hvilket så kan resultere i mistede timer (hvis der er sekunder nok). Du kan prøve med denne, hvis det er interessant at håndtere flere sekunder end der er i 2-3 døgn:

function sec2time(secs)
  dim sTime, rest
  sTime = ""

  if secs > 0 then
    rest = secs
    do while rest > 0 and len(sTime) < 6
      if len(sTime) > 0 then sTime = ":" & sTime
      if len(sTime) >= 5 then
        if rest > 9 then
          sTime = int(rest) & sTime
        else
          sTime = right("00" & (rest mod 60), 2) & sTime
        end if
        rest = 0
      else
        sTime = right("00" & (rest mod 60), 2) & sTime
        rest = rest / 60
      end if
    loop
  else
    sTime = "00:00:00"
  end if

  sec2time = sTime
end function

Og så kan du prøve at teste med større tal (f.eks. 100.000) for at se hvordan den håndterer disse.
Avatar billede para7 Nybegynder
26. oktober 2012 - 09:23 #6
Hov. Der er lige en fejl i din funktion. Hvis jeg tester sekunder fra 31-60:

30 seconds => time 00:00:30
34 seconds => time 00:01:34
60 seconds => time 00:01:00
Avatar billede para7 Nybegynder
26. oktober 2012 - 09:30 #7
Også lige fejl fra 90 og til 120 sekunder:

30 seconds => time 00:00:30
34 seconds => time 00:01:34
36 seconds => time 00:01:36
60 seconds => time 00:01:00
63 seconds => time 00:01:03
66 seconds => time 00:01:06
71 seconds => time 00:01:11
90 seconds => time 00:02:30
97 seconds => time 00:02:37
100 seconds => time 00:02:40
120 seconds => time 00:02:00
Avatar billede para7 Nybegynder
26. oktober 2012 - 09:40 #8
Umiddelbart er det lettest for mig at fixe min funktion, kan vel gøres ved at sætte undtagelser for 1, 2, 4 og 5 sekunder.


Min SecondsToTime:
1 seconds => time 01:00
2 seconds => time 03:00
3 seconds => time 00:03
4 seconds => time 06:00
5 seconds => time 08:00
30 seconds => time 00:30
34 seconds => time 00:34
36 seconds => time 00:36
60 seconds => time 01:00
63 seconds => time 01:03
66 seconds => time 01:06
71 seconds => time 01:11
90 seconds => time 01:30
97 seconds => time 01:37
100 seconds => time 01:40
120 seconds => time 02:00


Din sec2time:
1 seconds => time 00:00:01
2 seconds => time 00:00:02
3 seconds => time 00:00:03
4 seconds => time 00:00:04
5 seconds => time 00:00:05
30 seconds => time 00:00:30
34 seconds => time 00:01:34
36 seconds => time 00:01:36
60 seconds => time 00:01:00
63 seconds => time 00:01:03
66 seconds => time 00:01:06
71 seconds => time 00:01:11
90 seconds => time 00:02:30
97 seconds => time 00:02:37
100 seconds => time 00:02:40
120 seconds => time 00:02:00
Avatar billede softspot Forsker
26. oktober 2012 - 09:47 #9
Det er jo op til dig, men jeg har lavet en anden version som også fikser det andet problem. Det var et afrundingsproblem der gjorde udslaget.

function iif(cond, truepart, falsepart)
  if cond then
    iif = truepart
  else
    iif = falsepart
  end if
end function

function sec2time(secs)
  dim sTime, rest, arrDiv, i

  sTime = ""
  arrDiv = array(60,60,0)

  rest = secs
  for i = 0 to 2
    if arrDiv(i) > 0 then
      val = rest mod arrDiv(i)
      rest = fix(rest / arrDiv(i))
    else
      val = rest
    end if

    if val < 10 then val = right("00" & val, 2)

    sTime = val & iif(len(sTime) > 0, ":", "") & sTime
  next

  sec2time = sTime
end function

Bemærk der er kommet en hjælperfunktion med (iif) for at gøre løkken lidt mere kompakt.
Avatar billede para7 Nybegynder
26. oktober 2012 - 09:46 #10
Her er min funktion med korrektioner:

Function SecondsToTime(ByVal SecondsX)
    If SecondsX = 1 Or SecondsX = 2 Or SecondsX = 4 Or SecondsX = 5 Then
        SecondsToTime = "00:0" & SecondsX
    Else
        secondsToTime0 = SecondsX/60
        If InStr(secondsToTime0,",") Then
            secondsToTimeMinutePart0 = left(secondsToTime0,InStr(secondsToTime0,",")-1)
        Else
            secondsToTimeMinutePart0 = secondsToTime0
        End If
        If Len(secondsToTimeMinutePart0) = 1 Then
            secondsToTimeMinutePart = "0" & secondsToTimeMinutePart0
        Else
            secondsToTimeMinutePart = secondsToTimeMinutePart0
        End If
        If InStr(secondsToTime0,",") Then
            secondsToTimeSecondPart0 = mid(secondsToTime0,InStr(secondsToTime0,",")+1)
        Else
            secondsToTimeSecondPart0 ="00"
        End If
        secondsToTimeSecondPart0 = ("0," & secondsToTimeSecondPart0)*60
        secondsToTimeSecondPart0 = Round(secondsToTimeSecondPart0)
        If Len(secondsToTimeSecondPart0) = 1 Then
            secondsToTimeSecondPart = "0" & secondsToTimeSecondPart0
        Else
            secondsToTimeSecondPart = secondsToTimeSecondPart0
        End If
        SecondsToTime = secondsToTimeMinutePart & ":" & secondsToTimeSecondPart
    End If
End Function
Avatar billede para7 Nybegynder
26. oktober 2012 - 10:51 #11
Udmærket. Så er der også andre der kan få gavn af det her, senere. For det har ikke været til at opstøve færdige asp funktioner til det her. Min egen metode er mere forståelig for mig, selvom den nok ikke er så smart.
Tak for nu :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester