Jump to content


du_82

Member Since 23/04/2003
Offline Last Active 24/09/2007, 20:23
-----

Posts I've Made

In Topic: Cálculo Data / Hora

13/12/2004, 07:20

Corrigido mais uma veiz (versão 0.00001b) cheio de bugs provavelmente hehehe:

Function FormatDateTime(DateTime)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  FormatDateTime()
  'Descrição: Formata hora e data para o formato [dd/mm/yyyy] e [hh:mm:ss]

  If InStr(1, DateTime, "/") > 0 Then
    sDta = DateTime
    If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
    If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
    FormatDateTime = sDta
  Else
    sTime = DateTime
    If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
    If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
    If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
    FormatDateTime = sTime
  End If
End Function

Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  CalculaHoras()
  'Descrição: Calcula as horas durante um período de datas

  Dim arrDias(5, 2)

  arrDias(0, 0) = "08:00:00": arrDias(0, 1) = "17:30:00" 'Segunda
  arrDias(1, 0) = "08:00:00": arrDias(1, 1) = "17:30:00" 'Terça
  arrDias(2, 0) = "08:00:00": arrDias(2, 1) = "17:30:00" 'Quarta
  arrDias(3, 0) = "08:00:00": arrDias(3, 1) = "17:30:00" 'Quinta
  arrDias(4, 0) = "08:00:00": arrDias(4, 1) = "15:30:00" 'Sexta
 'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

  iD = Day(DataInicial)
  iM = Month(DataInicial)
  iA = Year(DataInicial)

  Do Until DataTmp = DataFinal
    DiaIni = iD
    MesIni = iM
    AnoIni = iA

    DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

    If IsDate(DataTmp) Then
      Select Case Weekday(DataTmp)
        Case 2, 3, 4, 5, 6 ', 7
          sDias = sDias & DataTmp & "*"
      End Select
    End If

    iD = iD + 1
    If iD = 32 Then
      iM = iM + 1
      iD = 1
      If iM = 13 Then
        iA = iA + 1
        iM = 1
        iD = 1
      End If
    End If
  Loop

  If sDias <> "" Then
    If InStr(1, sDias, "*") > 0 Then
      sDias = Left(sDias, Len(sDias) - 1)
      If InStr(1, sDias, "*") > 0 Then
        Dias = Split(sDias, "*")

        For i = LBound(Dias) To UBound(Dias)
          If i = LBound(Dias) Then
            If HoraInicial > arrDias(Weekday(Dias(i)) - 2, 0) Then
              HoraIniTmp = HoraInicial
            Else
              HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
            End If
          Else
            HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
          End If

          If i = UBound(Dias) Then
            If HoraFinal < arrDias(Weekday(Dias(i)) - 2, 1) Then
              HoraFimTmp = HoraFinal
            Else
              HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
            End If
          Else
            HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
          End If

          SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

        Next

      Else
        If HoraInicial > arrDias(Weekday(sDias) - 2, 0) Then
          HoraIniTmp = HoraInicial
        Else
          HoraIniTmp = arrDias(Weekday(sDias) - 2, 0)
        End If
        If HoraFinal < arrDias(Weekday(sDias) - 2, 1) Then
          HoraFimTmp = HoraFinal
        Else
          HoraFimTmp = arrDias(Weekday(sDias) - 2, 1)
        End If

        SecDif = DateDiff("s", HoraIniTmp, HoraFimTmp)
      End If

    End If
  Else
    CalculaHoras = -1
    Exit Function
  End If

  MinDif = SecDif \ 60
  SecDif = SecDif Mod 60
  HourDif = MinDif \ 60
  MinDif = MinDif Mod 60

  CalculaHoras = FormatDateTime(HourDif & ":" & MinDif & ":" & SecDif)

End Function

Teste ae..tem q dar 16:30:

  Response.Write CalculaHoras("10/12/2004", "08:30:00", "13/12/2004", "21:00:45")

Bom dia HDZ,

Chego a acreditar que é alguma distorção do meu servidor web aqui, pois novamente com o seu código (CTRL + C / CTRL + V) me retornou um horario não desejado = 390:0:00. Muito estranho.

Agora o que comprova que o problema é aqui, é que o resultado da função que o Leo fez também retorna um horario distorcido = 409:00.

Ambos resultados de acordo com os horarios que vocês escolheram ai no seus posts.

De qualquer forma valeu, ja ajudou e muito! (como aprendizado)
Vou ver com o pessoal de infra-estrutura WEB aqui para saber quais possíveis motivos...

Valeu!
Abraços,

In Topic: Cálculo Data / Hora

10/12/2004, 11:10

Hdz,

Não sei o que está ocorrendo, mas o resultado não esta retornando corretamente na tela, veja logo no final do seu código, como eu inicializei as variáveis!
O resultado que esta retornando é:
367:30:00

<%
 Function FormatDateTime(DateTime)
   If InStr(1, DateTime, "/") > 0 Then
     sDta = DateTime
     If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
     If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
     FormatDateTime = sDta
   Else
     sTime = DateTime
     If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
     If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
     If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
     FormatDateTime = sTime
   End If
 End Function




 Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
   Dim arrDias(5,2)

   arrDias(0,0) = "08:00:00": arrDias(0,1) = "17:30:00" 'Segunda
   arrDias(1,0) = "08:00:00": arrDias(1,1) = "17:30:00" 'Terça
   arrDias(2,0) = "08:00:00": arrDias(2,1) = "17:30:00" 'Quarta
   arrDias(3,0) = "08:00:00": arrDias(3,1) = "17:30:00" 'Quinta
   arrDias(4,0) = "08:00:00": arrDias(4,1) = "15:30:00" 'Sexta
  'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

   iD = Day(DataInicial)
   iM = Month(DataInicial)
   iA = Year(DataInicial)

   Do Until DataTmp = DataFinal
     DiaIni = iD
     MesIni = iM
     AnoIni = iA

     DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

     If IsDate(DataTmp) Then
       Select Case WeekDay(DataTmp)
         Case 2, 3, 4, 5, 6 ', 7
           sDias = sDias & DataTmp & "*"
       End Select
     End If

     iD = iD + 1
     If iD = 32 Then
       iM = iM + 1
       iD = 1
       If iM = 13 Then
         iA = iA + 1
         iM = 1
         iD = 1
       End If
     End If
   Loop

   If sDias <> "" Then
     If InStr(1, sDias, "*") > 0 Then
       sDias = Left(sDias, Len(sDias) - 1)
       If InStr(1, sDias, "*") > 0 Then
         Dias = Split(sDias, "*")

         For i = LBound(Dias) To UBound(Dias)
           If i = LBound(Dias) Then
             If HoraInicial > arrDias(WeekDay(Dias(i)) - 2, 0) Then
               HoraIniTmp = HoraInicial
             Else
               HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
             End If
           Else
             HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
           End If

           If i = UBound(Dias) Then
             If HoraFinal < arrDias(WeekDay(Dias(i)) - 2, 1)  Then
               HoraFimTmp = HoraFinal
             Else
               HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
             End If
           Else
             HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
           End If

           SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

         Next

       Else
         SecDif = DateDiff("s", HoraInicial, HoraFinal)
       End If

     End If
   Else
     CalculaHoras = -1
     Exit Function
   End If

   MinDif = SecDif \ 60
   SecDif = SecDif Mod 60
   HourDif = MinDif \ 60
   MinDif = MinDif Mod 60

   If Len(SecDif) = 1 Then SecDif = "0" & SecDif
   If Len(MinDif) = 1 Then MinDif = "0" & MinDif
   If Len(HourDif) = 1 Then HourDif = "0" & HourDif

   CalculaHoras = HourDif & ":" & MinDif & ":" & SecDif



 End Function
%>

<%
dim string

DataInicial = "10/12/2004"
HoraInicial = "08:00:00"
DataFinal = "10/12/2004"
HoraFinal = "15:30:00"

String = CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal) 

response.write String

%>

In Topic: Cálculo Data / Hora

08/12/2004, 23:32

Bom dia,


Estou precisando fazer um sistema de cálculo de datas e horas (calculo de tempo de atendimento de um chamado), esse sistema vai funcionar da seguinte forma:
Expedientes...
Segunda-Feira - 08:00:00 / 17:30:00
Terça-Feira - 08:00:00 / 17:30:00
Quarta-Feira - 08:00:00 / 17:30:00
Quinta-Feira - 08:00:00 / 17:30:00
Sexta-Feira - 08:00:00 / 15:30:00

Vamos supor que abro um chamado na terça-feira às 14:30:00, esse chamado é encerrado na quinta-feira às 09:00:00. Preciso calcular o tempo que há entre essas duas datas/horas, mas há um porém que dificulta minha vida aqui... O cronometro deve rodar até atingir o final do expediente, por exemplo: Na terça contabilizo as horas das 14:30:00 até 17:30:00 e paro o cronometro, na quarta volto andar o cronometro à partir das 08:00:00 e paro novamente às 17:30:00 e assim por diante. Quero contabilizar apenas os horários que realmente são trabalhados...
Tem como desenvolver algo para resolver meu problema?
Detalhe: A data/hora inicial e a data/hora final à ser calculada já está armazenada e disponível.

Obrigado!



Eu vo faze uma function.. mas soh há horas para esses dias da semana?

Sim inicialmente somente esses períodos mencionados!!!
Posteriormente entrará o s´bado também, mas ai é questão de adaptação apenas...

Se puder me ajudar, agradeço e muito!

IPB Skin By Virteq