Avatar billede jgp Nybegynder
02. marts 2005 - 14:39 Der er 11 kommentarer og
1 løsning

Beregning af tid, som falder imellem 2 tidspunkter i en periode

Hej,

Jeg skal buge en ASP funktion, som kan beregne hvor mange minutter der falder inden for et bestemt tidsrum i en periode.

Eksemple:
Tidsrum: 15:00 til 18:00 alle søndage
Periode: 02/20/2005 16:00 til 02/28/2005 19:00
Funktionen skal returnere hvor mange minutter i perioden der falder inden for tidsrummet. I overstående teksemple vil det være 300 minuter.

Håber I kan hjælpe
JGP
Avatar billede fennec Nybegynder
02. marts 2005 - 14:50 #1
time1 = date() &" "& right("02/20/2005 16:00",5)
time2 = date() &" "& right("02/28/2005 19:00",5)

datediff("n",time1,time2)
Avatar billede mortency Nybegynder
02. marts 2005 - 14:55 #2
//Fennec

Hvorfor tar du med date() samt right og 5 tegn?

Bare lurer.
//Morten
Avatar billede fennec Nybegynder
02. marts 2005 - 15:27 #3
Var ikke sikker på hvordan den ville opføre sig, hvis den kun fik time/min tallet. Så jeg ville gør det til en rigtig dato.

Gik desuden ud fra at jqp får de forskellige datoer/tider fra en variabel, også bruger jeg right funktionen til at pille time/min ud, og smide dem i en ny variabel.
Avatar billede jgp Nybegynder
02. marts 2005 - 16:36 #4
Fennec: Så vidt jeg umiddelbart kan se, kigger de løsnige udelukkede på hvor lang tid der er imellem tiderne på de 2 timestamps.

Den vil ikke tage højde for om tiden ligger inden for Tidsrummet. Den vil ikke tage højde for at perioden går over flere søndage.

Desvære.
Avatar billede fennec Nybegynder
03. marts 2005 - 08:48 #5
... Så er jeg ikke med på hvad du ønsker. Kan du forklare det anderledes???
Avatar billede jgp Nybegynder
03. marts 2005 - 09:21 #6
Jeg kan da prøve:

Du ser fodbold hver søndag imellem 15:00 og 18:00. Jeg kunne godt tænke mig en funktion, der kan beregne hvor mange minuters fodbold du så i perioderne 2004-01-01 til 2004-12-31 og 2005-02-01 til 2005-02-28.

Håber det afklare opgaven.
Avatar billede fennec Nybegynder
03. marts 2005 - 10:17 #7
Så er jeg med, men hvordan det skal gøres er jeg ikke sikker på.

Tidsrummet kan det godt gå over flere dage?? Hvis man f.eks ser TV fra lørdag 22:00 til søndag 02:00 eller helt ekstrem fre 23:00 til søn 10:00.
Avatar billede jgp Nybegynder
03. marts 2005 - 13:08 #8
Fik lavet denne her funktion, som gerne skulle kunne klare det:

Response.Write calcServiceWindow("06-03-2005 16:00:00", "13-03-2005 19:00:00", "15:00:00", "18:00:00", vbSunday)
'** Calculate Service Window in minutes (SW) - SW is a specific timespan on a weekday **'
  Function calcServiceWindow(timestampStart, timestampEnd, SWstart, SWend, SWday)
    Dim countSWdays, FirstSundayDiff, LastSundayDiff, DaysInPeriod, SWlength
    DaysInPeriod = DateDiff("d", timestampStart, timestampEnd)
    SWlength = DateDiff("n", SWstart, SWend)
    countSWdays = 0

    '** Get number of SWday's in period **'
    If DaysInPeriod => 1 Then
      countSWdays = Int(DaysInPeriod / 7)
      '** If =>8, period must contain an extra SWday Or If 1, period end and start on SWday **'
      If (Weekday(timestampStart) + DaysInPeriod Mod 7) => 8 Or Weekday(timestampStart) = SWday Then countSWdays = countSWdays + 1
    End If

    '** If first or last date is a SWday **'
    If DatePart("w", timestampStart, SWday) = 1 Then
      '** Are period only one day? **'
      If DateDiff("d", timestampStart, timestampEnd) = 0 And DateDiff("n", FormatDateTime(timestampEnd, 3), SWend) > 0 Then
        If DateDiff("n", FormatDateTime(timestampStart, 3), SWstart) < 0 Then
          FirstSundayDiff = DateDiff("n", FormatDateTime(timestampStart, 3), FormatDateTime(timestampEnd, 3))
        Else
          FirstSundayDiff = DateDiff("n", SWstart, FormatDateTime(timestampEnd, 3))
        End If
      Else '** Period is more than one day
        FirstSundayDiff = DateDiff("n", FormatDateTime(timestampStart, 3), SWstart)
        If FirstSundayDiff > 0 Then FirstSundayDiff = 0 : countSWdays = countSWdays + 1 '** Full SW
        If FirstSundayDiff < (SWlength*-1) Then FirstSundayDiff = 0 '** Starts after SW ends
        If FirstSundayDiff <> 0 Then FirstSundayDiff = SWlength - (FirstSundayDiff*-1) '** Some SW
        countSWdays = countSWdays -1
      End If
    End If
    If DatePart("w", timestampEnd, SWday) = 1 And DateDiff("d", timestampStart, timestampEnd) > 0  Then
      LastSundayDiff = DateDiff("n", SWend, FormatDateTime(timestampEnd, 3))
      If LastSundayDiff > 0 Then LastSundayDiff = 0 : countSWdays = countSWdays + 1 '** Full SW
      If LastSundayDiff < (SWlength*-1) Then LastSundayDiff = 0 '** Ends before SW starts
      If LastSundayDiff <> 0 Then LastSundayDiff = SWlength - (LastSundayDiff*-1) '** Some SW
      countSWdays = countSWdays -1
    End If
    calcServiceWindow = (SWlength * countSWdays) + Abs(FirstSundayDiff) + Abs(LastSundayDiff)
  End Function
Avatar billede jgp Nybegynder
03. marts 2005 - 13:12 #9
fennec: Som du kan se, kan man PT ikke se fodbold hen over midnat. Eller funktionen kan i hvert fald ikke finde ud af det :-) Tak for hjælpen
Avatar billede fennec Nybegynder
03. marts 2005 - 13:24 #10
Det var nu ikke så meget hjælp jeg fik givet :o)
Avatar billede jgp Nybegynder
03. marts 2005 - 18:35 #11
Fandt et par fejl, denne version skulle gerne være mere fejlfri:

Function calcServiceWindow(timestampStart, timestampEnd, SWstart, SWend, SWday)
    Dim countSWdays, FirstSundayDiff, LastSundayDiff, DaysInPeriod, SWlength, tmpSWstart, tmpSWend
    DaysInPeriod = DateDiff("d", timestampStart, timestampEnd)
    SWlength = DateDiff("n", SWstart, SWend)
    countSWdays = 0

    '** Get number of SWday's in period **'
    countSWdays = Int(DaysInPeriod / 7)
    '** If =>8, period must contain an extra SWday Or If 1, period end and start on SWday **'
    If (Weekday(timestampStart) + DaysInPeriod Mod 7) => 8 Or Weekday(timestampStart) = SWday Then countSWdays = countSWdays + 1

    '** If first or last date is a SWday **'
    If DatePart("w", timestampStart, SWday) = 1 Then
      If DateDiff("n", FormatDateTime(timestampStart, 3), SWend) < 0 Then '** X<XXX>O - Period starts after SW ends
        FirstSundayDiff = 0
      ElseIf DateDiff("n", FormatDateTime(timestampEnd, 3), SWstart) > 0 And _
            DaysInPeriod = 0 Then '** O<XXX>X - Period ends before SW starts
        FirstSundayDiff = 0
      ElseIf DateDiff("n", FormatDateTime(timestampStart, 3), SWstart) < 0 And _
            DateDiff("n", FormatDateTime(timestampEnd, 3), SWend) > 0 And _
            DaysInPeriod = 0 Then '** X<XOX>X - Period starts before SW starts and ends before SW ends
        FirstSundayDiff = DateDiff("n", FormatDateTime(timestampStart, 3), FormatDateTime(timestampEnd, 3))
      ElseIf DateDiff("n", FormatDateTime(timestampStart, 3), SWstart) < 0 And _
            (DateDiff("n", FormatDateTime(timestampEnd, 3), SWend) < 0 Or _
            DaysInPeriod > 0) Then '** X<XOO>O - Period starts after SW starts and ends after SW ends
        FirstSundayDiff = DateDiff("n", FormatDateTime(timestampStart, 3), SWend)
      ElseIf DateDiff("n", FormatDateTime(timestampStart, 3), SWstart) > 0 And _
            DateDiff("n", FormatDateTime(timestampEnd, 3), SWend) > 0 And _
            DaysInPeriod = 0 Then '** O<OOX>X - Period starts before SW starts and ends before SW ends
        FirstSundayDiff = DateDiff("n", SWstart, FormatDateTime(timestampEnd, 3))
      ElseIf DateDiff("n", FormatDateTime(timestampStart, 3), SWstart) > 0 And _
            (DateDiff("n", FormatDateTime(timestampEnd, 3), SWend) < 0 Or _
            DaysInPeriod > 0) Then '** O<OOO>O - Period starts before SW starts and ends after SW ends
        FirstSundayDiff = SWlength
      End If
      countSWdays = countSWdays -1
    End If
    If DatePart("w", timestampEnd, SWday) = 1 And DateDiff("d", timestampStart, timestampEnd) > 0  Then
      LastSundayDiff = DateDiff("n", SWend, FormatDateTime(timestampEnd, 3))
      If LastSundayDiff > 0 Then LastSundayDiff = 0 : countSWdays = countSWdays + 1 '** Full SW
      If LastSundayDiff < (SWlength*-1) Then LastSundayDiff = 0 '** Ends before SW starts
      If LastSundayDiff <> 0 Then LastSundayDiff = SWlength - (LastSundayDiff*-1) '** Some SW
      countSWdays = countSWdays -1
    End If
    calcServiceWindow = (SWlength * countSWdays) + Abs(FirstSundayDiff) + Abs(LastSundayDiff)
  End Function
Avatar billede jgp Nybegynder
04. marts 2005 - 15:44 #12
En noget bedre funktion. Løsningen er baseret på en løsning modtaget fra en anden "hjælpe" side:

Response.Write getSWminutes("06/03/2005 17:00", "13/03/2005 17:00", "15:00:00", "18:00:00", vbSunday)
Function getSWminutes(sd, ed, WindowStart, WindowEnd, WindowDay)
  Dim Windows : Windows = DateDiff("ww", sd, ed, WindowDay)
  Dim Interval : Interval = DateDiff("n", WindowStart, WindowEnd)
  If WeekDay(sd) = WindowDay Then Windows = Windows + 1
  getSWminutes = Windows * Interval - SWBoundary(sd, WindowStart, Interval, WindowDay, False) - SWBoundary(ed, WindowStart, Interval, WindowDay, True)
End Function

Function SWBoundary(d, WindowStart, Interval, WindowDay, LastDay)
  If WeekDay(d) = WindowDay Then
    SWBoundary = DateDiff("n",FormatDateTime(d,2) & " " & WindowStart,d)
    If SWBoundary < 0 Then SWBoundary = 0
    If SWBoundary > Interval Then SWBoundary = Interval
    If LastDay Then SWBoundary = Interval - SWBoundary
  Else
    SWBoundary = 0
  End If
End Function
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
Kategori
Kurser inden for grundlæggende programmering

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