Date - Manipulation (Erhöhen)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Date - Manipulation (Erhöhen)

Beitrag von cxAlex »

Servus.

Eigentlich eine triviale Aufgabe, das Datum berechnen das in 1000 Sekunden oder 45 Tagen sein wird. Doch nicht so einfach, den einfach per Date() die Day() Angabe um 45 zu erhöhen läuft nicht, da muss man selbst ran :P

Darum hab ich mir ein kleines Include geschrieben (vorerst kann das Datum nur nach vorne berechnet werden, also in die Zukunft) welches mit das das Datum berechnet das in n {Jahren|Monaten|Tagen|Stunden|Minuten|Sekunden} oder einer Kombination daraus (z.B. in 27 Monaten und 56 Tagen) berechnet, unter Berücksichtigung von verschieden langen Monaten, sämtlichen Regeln für Schaltjahre ... . Bisher nur in die Zukunft, mal sehen ob ichs auch nocht für die Vergangenheit hinklopfe ;)

Auch lässt sich damit z.B. ermitteln wie viele Stunden, Minuten und Sekunden usw. z.B. 200.000 Sekunden sind, mit Date alleine geht das nicht:

Code: Alles auswählen

Define d = Date()
Define but = d

d = IncreaseDate(d, 0, 0, 0, 0, 0, 200000) - but
Debug FormatDate("%hh:%ii:%ss", d)

d = Date(0, 0, 0, 0, 0, 200000)
Debug FormatDate("%hh:%ii:%ss", d)
// EDIT: Steinigt mich, ich hab erst jetzt in der Hilfe AddDate() gesehen :oops: :oops: :oops:

Code: Alles auswählen

; EnableExplicit

; Schaltjahr - Erkennug
Macro __isLeapYear(Date)
  Bool(((Not Year(Date)%4) And Year(Date)%100) Or (Not Year(Date)%400))
EndMacro

; Jahre dazuzählen
Procedure IncreaseYears(Date, NumberOfYears = 1)
  ProcedureReturn Date(Year(Date)+NumberOfYears, Month(Date), Day(Date), Hour(Date), Minute(Date), Second(Date))
EndProcedure

; Monate Dazuzählen
Procedure IncreaseMonths(Date, NumberOfMonths = 1)
  Protected i
  For i = 1 To NumberOfMonths
    Select Month(Date)
      Case 12
        Date = Date(Year(Date)+1, 1, Day(Date), Hour(Date), Minute(Date), Second(Date))
      Default
        Date = Date(Year(Date), Month(Date)+1, Day(Date), Hour(Date), Minute(Date), Second(Date))
    EndSelect
  Next
  ProcedureReturn Date
EndProcedure

; Tage Dazuzählen
Procedure IncreaseDays(Date, NumberOfDays = 1)
  Protected i
  For i = 1 To NumberOfDays
    Select Month(Date)
      Case 4,6,9,11
        If Day(Date) = 30
          Date = Date(Year(Date), Month(Date)+1, 1, Hour(Date), Minute(Date), Second(Date))
        Else
          Date = Date(Year(Date), Month(Date), Day(Date)+1, Hour(Date), Minute(Date), Second(Date))
        EndIf
      Case 1,3,5,7,8,10
        If Day(Date) = 31
          Date = Date(Year(Date), Month(Date)+1, 1, Hour(Date), Minute(Date), Second(Date))
        Else
          Date = Date(Year(Date), Month(Date), Day(Date)+1, Hour(Date), Minute(Date), Second(Date))
        EndIf
      Case 12
        If Day(Date) = 31
          Date = Date(Year(Date)+1, 1, 1, Hour(Date), Minute(Date), Second(Date))
        Else
          Date = Date(Year(Date), Month(Date), Day(Date)+1, Hour(Date), Minute(Date), Second(Date))
        EndIf
      Case 2
        If Day(Date) = 29 ; Schaltjahr
          Date = Date(Year(Date), Month(Date)+1, 1, Hour(Date), Minute(Date), Second(Date))
        ElseIf Day(Date) = 28
          ; Schaltjahr - Erkennung:
          If __isLeapYear(Date)
            Date = Date(Year(Date), Month(Date), Day(Date)+1, Hour(Date), Minute(Date), Second(Date))
          Else
            Date = Date(Year(Date), Month(Date)+1, 1, Hour(Date), Minute(Date), Second(Date))
          EndIf
        Else
          Date = Date(Year(Date), Month(Date), Day(Date)+1, Hour(Date), Minute(Date), Second(Date))
        EndIf
    EndSelect
  Next
  ProcedureReturn Date
EndProcedure

; Stunde erhöhen
Procedure IncreaseHours(Date, NumberOfHours = 1)
  If (Hour(Date) + NumberOfHours)/24
    Date = IncreaseDays(Date, (Hour(Date) + NumberOfHours)/24)
  EndIf
  ProcedureReturn Date(Year(Date), Month(Date), Day(Date), (Hour(Date) + NumberOfHours)%24, Minute(Date), Second(Date)) 
EndProcedure

; Minute erhöhen
Procedure IncreaseMinutes(Date, NumberOfMinutes = 1)
  If (Minute(Date) + NumberOfMinutes)/60
    Date = IncreaseHours(Date, (Minute(Date) + NumberOfMinutes)/60)
  EndIf
  ProcedureReturn Date(Year(Date), Month(Date), Day(Date), Hour(Date), (Minute(Date) + NumberOfMinutes)%60, Second(Date)) 
EndProcedure

; Sekunde erhöhen
Procedure IncreaseSecond(Date, NumberOfSeconds = 1)
  If (Second(Date) + NumberOfSeconds)/60
    Date = IncreaseMinutes(Date, (Second(Date) + NumberOfSeconds)/60)
  EndIf
  ProcedureReturn Date(Year(Date), Month(Date), Day(Date), Hour(Date), Minute(Date), (Second(Date) + NumberOfSeconds)%60) 
EndProcedure

; Datum erhöhen
Procedure IncreaseDate(Date, NumberOfYears = 0, NumberOfMonths = 0, NumberOfDays = 0, NumberOfHours = 0, NumberOfMinutes = 0, NumberOfSeconds = 0)
  If NumberOfYears
    Date = IncreaseYears(Date, NumberOfYears)
  EndIf
  If NumberOfMonths
    Date = IncreaseMonths(Date, NumberOfMonths)
  EndIf
  If NumberOfDays
    Date = IncreaseDays(Date, NumberOfDays)
  EndIf
  If NumberOfHours
    Date = IncreaseHours(Date, NumberOfHours)
  EndIf
  If NumberOfMinutes
    Date = IncreaseMinutes(Date, NumberOfMinutes)
  EndIf
  If NumberOfSeconds
    Date = IncreaseSecond(Date, NumberOfSeconds)
  EndIf
  ProcedureReturn Date
EndProcedure
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Date - Manipulation (Erhöhen)

Beitrag von Lambda »

*Stein an Kopf werf* :D

Trotzdem Danke für deine Bemühungen :D , hatte selbst vor kurzem so einen Rechner benötigt.
Antworten