Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Date functions
#11
(03-04-2024, 06:12 PM)Kernelpanic Wrote: This all looks mighty mighty complicated, folks. Everything is there in VB-Script to do calculations with dates, and it's easy. The question is, can one integrate a VB script into QB64, because that would really be the easiest way.

Not to forget, these functions are from MS itself and have proven themselves many times over; earlier, when VB-Script was also used in websites.

A little simple program - calculates the days beween two dates.

Code: (Select All)

'Differenz zweier Datumsangaben ermitteln

WScript.Echo DateDiff("d", Now, "1.4.2024") & " Tage bis zum 1. April 2024"

[Image: Datumsdifferenz2024-03-04.jpg]
You can do these and other date/time related things very easy with the library I posted above.
Just add to your program and calculate differences, leapyear, weekdays, daylight saving, timezones, etc.
45y and 2M lines of MBASIC>BASICA>QBASIC>QBX>QB64 experience
Reply
#12
(03-04-2024, 06:12 PM)Kernelpanic Wrote: This all looks mighty mighty complicated, folks. Everything is there in VB-Script to do calculations with dates, and it's easy. The question is, can one integrate a VB script into QB64, because that would really be the easiest way.

Not to forget, these functions are from MS itself and have proven themselves many times over; earlier, when VB-Script was also used in websites.
The big problem with relying on vbscript is that it isn't cross-platform. 
It works for Windows, but not Mac and Linux.
Reply
#13
(03-05-2024, 07:18 PM)madscijr Wrote:
(03-04-2024, 06:12 PM)Kernelpanic Wrote: This all looks mighty mighty complicated, folks. Everything is there in VB-Script to do calculations with dates, and it's easy. The question is, can one integrate a VB script into QB64, because that would really be the easiest way.

Not to forget, these functions are from MS itself and have proven themselves many times over; earlier, when VB-Script was also used in websites.
The big problem with relying on vbscript is that it isn't cross-platform. 
It works for Windows, but not Mac and Linux.
Agreed! This may sound rude, but 98% of all QB64 users are likely to do this on a Windows system. Should 2% determine over 98%? I do not think that this is well.
Reply
#14
Quote:@mdijkens - You can do these and other date/time related things very easy with the library I posted above.
Just add to your program and calculate differences, leapyear, weekdays, daylight saving, timezones, etc.
Thank you for your hint. The key point about "DateDiff" is, how should I use that for calculations?
I know "DateDiff" from VB-Script and from Visual Basic, and there I used it for calculations in financial programs. I was able to use the result of “DateDiff” when calculating the repayment amount of loans.

Back then, I recalculated all formulas and results in all programs using a calculator, and when "DateDiff" was used, for example, it always delivered a correct result.

There can't be even the slightest mistake in finance. . . otherwise the Third World War will break out.  Tongue
Reply
#15
(03-05-2024, 10:52 PM)Kernelpanic Wrote:
(03-05-2024, 07:18 PM)madscijr Wrote:
(03-04-2024, 06:12 PM)Kernelpanic Wrote: This all looks mighty mighty complicated, folks. Everything is there in VB-Script to do calculations with dates, and it's easy. The question is, can one integrate a VB script into QB64, because that would really be the easiest way.

Not to forget, these functions are from MS itself and have proven themselves many times over; earlier, when VB-Script was also used in websites.
The big problem with relying on vbscript is that it isn't cross-platform. 
It works for Windows, but not Mac and Linux.
Agreed! This may sound rude, but 98% of all QB64 users are likely to do this on a Windows system. Should 2% determine over 98%? I do not think that this is well.
If you just use QB64PE on Windows and using vbscript works, great. 

I myself use vbscript for a ton of things on Windows, but I do like knowing my programs can work on those other OSes. So if someone wants to write some native QB64PE date functions that are multi-platform compatible, I can see the value.

Along those lines, I would imagine that much of the commonly used date functionality has been written before in GW Basic, QuickBasic, in VB 3-6, etc. Or any procedural language that can be ported over to QB64. It might be helpful if they can be updated to work with QB64 (or to learn from).
Reply
#16
Quote:Along those lines, I would imagine that much of the commonly used date functionality has been written before in GW Basic, QuickBasic, in VB 3-6, etc. Or any procedural language that can be ported over to QB64. It might be helpful if they can be updated to work with QB64 (or to learn from).
Correctly! “DateDiff” already existed in Visual Basic 3.0 Prof.
I'm not a developer, but this feature would be worth integrating into QB64.

One don't have to redevelop it for QB64, just create a way to integrate it. You enter a start and an end date, pass it to "DateDiff", and get the correct number of days etc. in order to be able to use this result further.

This function would not have to be reprogrammed for this.
Reply
#17
(03-05-2024, 11:13 PM)Kernelpanic Wrote:
Quote:@mdijkens - You can do these and other date/time related things very easy with the library I posted above.
Just add to your program and calculate differences, leapyear, weekdays, daylight saving, timezones, etc.
Thank you for your hint. The key point about "DateDiff" is, how should I use that for calculations?
I know "DateDiff" from VB-Script and from Visual Basic, and there I used it for calculations in financial programs. I was able to use the result of “DateDiff” when calculating the repayment amount of loans.

Back then, I recalculated all formulas and results in all programs using a calculator, and when "DateDiff" was used, for example, it always delivered a correct result.

There can't be even the slightest mistake in finance. . . otherwise the Third World War will break out.  Tongue
For something like DateDiff, if you convert the date and time units to UNIX time / epoch in a common time zone, isn't it just plain addition & subtraction? Then you just convert epoch back to standard date? 

I do think it would be useful if QB64PE added a native DateTime type like in VB6 / VBA / VBScript, with datediff and dateadd functions, but I think epoch should be able to handle most cases?
Reply
#18
Quote:For something like DateDiff, if you convert the date and time units to UNIX time / epoch in a common time zone, isn't it just plain addition & subtraction? Then you just convert epoch back to standard date? 

I do think it would be useful if QB64PE added a native DateTime type like in VB6 / VBA / VBScript, with datediff and dateadd functions, but I think epoch should be able to handle most cases?
Now I'm stumped. All I remember is that between 1998 and 2001 I created programs that enabled financial calculations on websites. That was intentional.
Since only IE was used internally, I was able to use VB Script without any problems. But I also used Visual Basic 3.0 Prof for corresponding programs. 

Long time ago.
Reply
#19
This has all been worked on already, in pure 100% QB64PE code, by yours truly.  All one has to do is plug what they need into their work, as below:

Code: (Select All)
Screen _NewImage(1280, 720, 32)

Print "Is the date in proper format?  The skies say "; CheckDayFormat(Date$)
Print "The Date = "; Date$
Print "Weekday  = "; GetWeekDayName(Date$); ", which is day number"; GetWeekDay(Date$); "of the week."
Print "Day      ="; GetDay(Date$)
Print "Month    ="; GetMonth(Date$)
Print "Year    ="; GetYear(Date$)
Print
Print "And to reverse the process we take those values and make them a date with :"; MakeDate(GetMonth(Date$), GetDay(Date$), GetYear(Date$))
Print
Print
Print
Print "And we can always fancify our date to universal formats: "
Print UniDate$("mm/dd/yyyy", Date$)
Print UniDate$("w, MM dd, YYYY", Date$)
Print UniDate$("W, MM DD, YYYY", Date$)
Print UniDate$("dd/mm/yyyy", Date$)
Print UniDate$("W, E D, YYYY", Date$)
Print UniDate$("mm-dd-yy", Date$)

Do
    Print
    Print "If you want to know the day that belongs to any date, give me a date in MM/DD/YYYY format =>";
    Input dat$
    If CheckDayFormat(dat$) Then
        Exit Do
    Else
        Print "Bad format for your date.  Sorry."

    End If
Loop
Print
Print dat$; "was a "; GetWeekDayName$(dat$)
Print
Print
Print "Do you want to know how many days were between two dates?"
Print "Give me the first date in MM/DD/YYYY format =>";
Input dat$
Print "Give me the first date in MM/DD/YYYY format =>";
Input dat2$
Print "There were "; DaysBetween(dat$, dat2$); " days between "; dat$; " and "; dat2$; "."


Function DaysBetween&& (t1$, t2$)
    t1## = TimeStamp(t1$, 0)
    t2## = TimeStamp(t2$, 0)
    If t2## < t1## Then Swap t1##, t2##
    DaysBetween = (t2## - t1##) / (60 * 60 * 24)
End Function

Function CheckDayFormat (Day As String) 'use MM/DD/YYYY format
    Dim As String DD, MM, YYYY, TD, TM, TY
    If Len(Day$) <> 10 Then Glitch = -1
    DD = Left$(Day, 2)
    MM = Mid$(Day, 4, 2)
    YYYY = Right$(Day, 4)
    TD = Right$("00" + _Trim$(Str$(Val(DD))), 2)
    TM = Right$("00" + _Trim$(Str$(Val(MM))), 2)
    TY = Right$("0000" + _Trim$(Str$(Val(YYYY))), 4)
    If TD <> DD Then Glitch = -1
    If TM <> MM Then Glitch = -1
    If TY <> YYYY Then Glitch = -1
    If Glitch = 0 Then CheckDayFormat = -1
End Function

Function GetDay& (Day As String) 'use MM/DD/YYYY format
    If CheckDayFormat(Day$) = 0 Then GetDay = 0: Exit Function
    GetDay = Val(Mid$(Day, 4, 2))
End Function

Function GetMonth& (Day As String) 'use MM/DD/YYYY format
    If CheckDayFormat(Day$) = 0 Then GetMonth = 0: Exit Function
    GetMonth = Val(Left$(Day, 2))
End Function

Function GetYear& (Day As String) 'use MM/DD/YYYY format
    If CheckDayFormat(Day$) = 0 Then GetYear = 0: Exit Function
    GetYear = Val(Right$(Day, 4))
End Function

Function GetWeekDay& (Day$) 'use MM/DD/YYYY format
    'From Zeller's congruence: https://en.wikipedia.org/wiki/Zeller%27s_congruence
    If CheckDayFormat(Day$) = 0 Then GetWeekDay = 0: Exit Function
    Dim As Long century, zerocentury, result
    Dim As Long MM, DD, YYYY
    MM = GetMonth(Day$): DD = GetDay(Day$): YYYY = GetYear(Day$)
    If MM < 3 Then MM = MM + 12: YYYY = YYYY - 1
    century = YYYY Mod 100
    zerocentury = YYYY \ 100
    result = (DD + Int(13 * (MM + 1) / 5) + century + Int(century / 4) + Int(zerocentury / 4) + 5 * zerocentury) Mod 7
    If result = 0 Then result = 7
    GetWeekDay& = result 'results are 1 to 7, from Sunday to Saturday
End Function

Function GetWeekDayName$ (Day$) 'use MM/DD/YYYY format
    Dim result As Long
    result = GetWeekDay(Day$)
    Select Case result
        Case 1: GetWeekDayName = "Sunday"
        Case 2: GetWeekDayName = "Monday"
        Case 3: GetWeekDayName = "Tuesday"
        Case 4: GetWeekDayName = "Wednesday"
        Case 5: GetWeekDayName = "Thursday"
        Case 6: GetWeekDayName = "Friday"
        Case 7: GetWeekDayName = "Saturday"
    End Select
End Function

Function MakeDate$ (MM As _Unsigned Long, DD As _Unsigned Long, YYYY As _Unsigned Long)
    Dim As String TD, TM, TY
    TM = Right$("00" + _Trim$(Str$(MM)), 2)
    TD = Right$("00" + _Trim$(Str$(DD)), 2)
    TY = Right$("0000" + _Trim$(Str$(YYYY)), 4)
    MakeDate = TM + "-" + TD + "-" + TY
End Function

Function UniDate$ (format$, userdate$)
    'some basic documentation for formatting:
    'dates sent via userdate$ should be in the standardized QB64 DATE$ format -- MM/DD/YYYY
    'To customize your return date format, use the following syntax
    'w = short weekday names.  (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
    'W = long weekday names.  (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
    'E = Extended month names.  (January, February, March....)
    'M = long month names.  (Jan, Feb, Mar...)
    'm = short month names.  (01, 02, 03...)
    'D = long day names.  (01st, 02nd, 03rd...)
    'd = short day names.  (01, 02, 03...)
    'Y or y (case insensitive) = year.  Number of Yy present determines the number of digits we return.
    '      YY = 2-digit year
    '      YYYY = 4 digit year
    '      Y with any additional number of y's = 4 digit year by default, so a typo of YYYYY is the same as YYYY.
    'Any other character is simply considered part of the desired output and faithfully carried over into the proper spot.
    '      For example, "mm/dd/yyyy" gives us "02/10/2023" for Feb 10th, 2023.
    '      Second example, "dd.mm.yyyy" gives us "10.02.2023" for the same date.
    '      Third example, "dd EE YYYY" gives us "02 February 2023" for that same date.
    'Note:  Extra digits of most of these codes are simply ignored for error proofing purposes, with only the initial code being accepted.
    '      For example "mM YYYY" is actually processed as a simple "m YYYY".  The process won't mix short, long, or extended results.
    '      Also for example, "m YY" is the *exact* same as "mm YY".
    '      Feel free to use extra digits as you desire to help you keep track of positional spacing in your format string.
    '      Even though "M D, yyyy" may process the same as "MMM DDDD, YYYY", the second may work better for you if you're trying to track
    '            position of formatted objects.  (The output would be "Feb 10th, 2023", and those extra characters help hold that
    '            positioning for us easily.)

    'And, I think that's it.  Enjoy, guys!

    Dim As String temp, m, d, y, firstchar, Day
    Dim out$
    Dim As Long MonthSet, DaySet, WeekdaySet, result, YearSet, mm, dd, yyyy, century, zerocentury

    temp$ = userdate$
    If temp$ = "" Then temp$ = Date$
    m$ = Left$(temp$, 2)
    d$ = Mid$(temp$, 4, 2)
    y$ = Right$(temp$, 4)
    temp$ = format$
    Do
        firstchar$ = Left$(temp$, 1)
        Select Case firstchar$
            Case "E" 'extended month
                temp$ = Mid$(temp$, 2)
                If Not MonthSet Then
                    MonthSet = -1
                    Select Case Val(m$)
                        Case 1: out$ = out$ + "January"
                        Case 2: out$ = out$ + "February"
                        Case 3: out$ = out$ + "March"
                        Case 4: out$ = out$ + "April"
                        Case 5: out$ = out$ + "May"
                        Case 6: out$ = out$ + "June"
                        Case 7: out$ = out$ + "July"
                        Case 8: out$ = out$ + "August"
                        Case 9: out$ = out$ + "September"
                        Case 10: out$ = out$ + "October"
                        Case 11: out$ = out$ + "November"
                        Case 12: out$ = out$ + "December"
                    End Select
                End If
            Case "M" 'long month
                temp$ = Mid$(temp$, 2)
                If Not MonthSet Then
                    MonthSet = -1
                    Select Case Val(m$)
                        Case 1: out$ = out$ + "Jan"
                        Case 2: out$ = out$ + "Feb"
                        Case 3: out$ = out$ + "Mar"
                        Case 4: out$ = out$ + "Apr"
                        Case 5: out$ = out$ + "May"
                        Case 6: out$ = out$ + "Jun"
                        Case 7: out$ = out$ + "Jul"
                        Case 8: out$ = out$ + "Aug"
                        Case 9: out$ = out$ + "Sep"
                        Case 10: out$ = out$ + "Oct"
                        Case 11: out$ = out$ + "Nov"
                        Case 12: out$ = out$ + "Dec"
                    End Select
                End If
            Case "m" 'short month
                temp$ = Mid$(temp$, 2)
                If Not MonthSet Then
                    MonthSet = -1
                    Select Case Val(m$)
                        Case 1: out$ = out$ + "01"
                        Case 2: out$ = out$ + "02"
                        Case 3: out$ = out$ + "03"
                        Case 4: out$ = out$ + "04"
                        Case 5: out$ = out$ + "05"
                        Case 6: out$ = out$ + "06"
                        Case 7: out$ = out$ + "07"
                        Case 8: out$ = out$ + "08"
                        Case 9: out$ = out$ + "09"
                        Case 10: out$ = out$ + "10"
                        Case 11: out$ = out$ + "11"
                        Case 12: out$ = out$ + "12"
                    End Select
                End If
            Case "D" 'long day
                temp$ = Mid$(temp$, 2)
                If Not DaySet Then
                    DaySet = -1
                    out$ = out$ + Right$("00" + _Trim$(d$), 2)
                    Select Case Val(d$)
                        Case 1, 11, 21, 31: out$ = out$ + "st"
                        Case 2, 22: out$ = out$ + "nd"
                        Case 3, 23: out$ = out$ + "rd"
                        Case Else: out$ = out$ + "th"
                    End Select
                End If
            Case "d" 'short day
                temp$ = Mid$(temp$, 2)
                If Not DaySet Then
                    DaySet = -1
                    out$ = out$ + Right$("00" + _Trim$(d$), 2)
                End If

            Case "W" 'long weekday
                temp$ = Mid$(temp$, 2)
                If Not WeekdaySet Then
                    GoSub getday
                    Select Case result
                        Case 0: Day$ = "Saturday"
                        Case 1: Day$ = "Sunday"
                        Case 2: Day$ = "Monday"
                        Case 3: Day$ = "Tuesday"
                        Case 4: Day$ = "Wednesday"
                        Case 5: Day$ = "Thursday"
                        Case 6: Day$ = "Friday"
                    End Select
                    out$ = out$ + Day$
                End If
            Case "w" 'short weekday
                temp$ = Mid$(temp$, 2)
                If Not WeekdaySet Then
                    GoSub getday
                    Select Case result
                        Case 0: Day$ = "Sat"
                        Case 1: Day$ = "Sun"
                        Case 2: Day$ = "Mon"
                        Case 3: Day$ = "Tue"
                        Case 4: Day$ = "Wed"
                        Case 5: Day$ = "Thr"
                        Case 6: Day$ = "Fri"
                    End Select
                    out$ = out$ + Day$
                End If
            Case "Y", "y" 'year
                If Not YearSet Then
                    YearSet = -1
                    If Left$(UCase$(temp$), 4) = "YYYY" Then
                        temp$ = Mid$(temp$, 5)
                        out$ = out$ + y$
                    ElseIf Left$(UCase$(temp$), 2) = "YY" Then
                        temp$ = Mid$(temp$, 3)
                        out$ = out$ + Right$(y$, 2)
                    Else
                        temp$ = Mid$(temp$, 2)
                        out$ = out$ + y$
                    End If
                Else
                    temp$ = Mid$(temp$, 2)
                End If
            Case Else 'seperator
                temp$ = Mid$(temp$, 2)
                out$ = out$ + firstchar$
        End Select
    Loop Until temp$ = ""
    UniDate$ = out$
    Exit Function

    getday:
    WeekdaySet = -1
    'From Zeller's congruence: https://en.wikipedia.org/wiki/Zeller%27s_congruence
    mm = Val(m$): dd = Val(d$): yyyy = Val(y$)
    If mm < 3 Then mm = mm + 12: yyyy = yyyy - 1
    century = yyyy Mod 100
    zerocentury = yyyy \ 100
    result = (dd + Int(13 * (mm + 1) / 5) + century + Int(century / 4) + Int(zerocentury / 4) + 5 * zerocentury) Mod 7
    Return
End Function

Function TimeStamp## (d1$, t##) 'date and timer
    'Based on Unix Epoch time, which starts at year 1970.
    Dim l As _Integer64, l1 As _Integer64, m As _Integer64
    Dim d As _Integer64, y As _Integer64, i As _Integer64
    Dim s As _Float, d$
    If CheckDayFormat(d1$) = 0 Then
        Print "Bad format for date.  Can not get a timestamp.  Default value of ERROR ERROR issued instead!"
        Error 5
        Exit Function
    End If
    d$ = d1$
    For i = 1 To Len(d$) 'replace hypens with /
        If Mid$(d$, i, 1) = "\" Then Mid$(d$, i) = "-"
        If Mid$(d$, i, 1) = "/" Then Mid$(d$, i) = "-"
    Next
    l = InStr(d$, "-")
    l1 = InStr(l + 1, d$, "-")
    m = Val(Left$(d$, l))
    d = Val(Mid$(d$, l + 1))
    y = Val(Mid$(d$, l1 + 1))
    If y < 1970 Then 'calculate shit backwards
        Select Case m 'turn the day backwards for the month
            Case 1, 3, 5, 7, 8, 10, 12: d = 31 - d '31 days
            Case 2: d = 28 - d 'special 28 or 29.
            Case 4, 6, 9, 11: d = 30 - d '30 days
        End Select
        If y Mod 4 = 0 And m < 3 Then 'check for normal leap year, and we're before it...
            d = d + 1 'assume we had a leap year, subtract another day
            If y Mod 100 = 0 And y Mod 400 <> 0 Then d = d - 1 'not a leap year if year is divisible by 100 and not 400
        End If

        'then count the months that passed after the current month
        For i = m + 1 To 12
            Select Case i
                Case 2: d = d + 28
                Case 3, 5, 7, 8, 10, 12: d = d + 31
                Case 4, 6, 9, 11: d = d + 30
            End Select
        Next

        'we should now have the entered year calculated.  Now lets add in for each year from this point to 1970
        d = d + 365 * (1969 - y) '365 days per each standard year
        For i = 1968 To y + 1 Step -4 'from 1968 onwards,backwards, skipping the current year (which we handled previously in the FOR loop)
            d = d + 1 'subtract an extra day every leap year
            If (i Mod 100) = 0 And (i Mod 400) <> 0 Then d = d - 1 'but skipping every year divisible by 100, but not 400
        Next
        s## = d * 24 * 60 * 60 'Seconds are days * 24 hours * 60 minutes * 60 seconds
        TimeStamp## = -(s## + 24 * 60 * 60 - t##)
        Exit Function
    Else
        y = y - 1970
    End If

    For i = 1 To m 'for this year,
        Select Case i 'Add the number of days for each previous month passed
            Case 1: d = d 'January doestn't have any carry over days.
            Case 2, 4, 6, 8, 9, 11: d = d + 31
            Case 3 'Feb might be a leap year
                If (y Mod 4) = 2 Then 'if this year is divisible by 4 (starting in 1972)
                    d = d + 29 'its a leap year
                    If (y Mod 100) = 30 And (y Mod 400) <> 30 Then 'unless..
                        d = d - 1 'the year is divisible by 100, and not divisible by 400
                    End If
                Else 'year not divisible by 4, no worries
                    d = d + 28
                End If
            Case 5, 7, 10, 12: d = d + 30
        End Select
    Next
    d = (d - 1) + 365 * y 'current month days passed + 365 days per each standard year
    For i = 2 To y - 1 Step 4 'from 1972 onwards, skipping the current year (which we handled previously in the FOR loopp)
        d = d + 1 'add an extra day every leap year
        If (i Mod 100) = 30 And (i Mod 400) <> 30 Then d = d - 1 'but skiping every year divisible by 100, but not 400
    Next
    s## = d * 24 * 60 * 60 'Seconds are days * 24 hours * 60 minutes * 60 seconds
    TimeStamp## = (s## + t##)
End Function

Function ExtendedTimer##
    'Simplified version of the TimeStamp routine, streamlined to only give positive values based on the current timer.
    'Note:  Only good until the year 2100, as we don't do all the fancy calculations for leap years.
    'A timer should work quickly and efficiently in the background; and the less we do, the less lag we might insert
    'into a program.

    Dim m As Integer, d As Integer, y As Integer
    Dim s As _Float, day As String
    day = Date$
    m = Val(Left$(day, 2))
    d = Val(Mid$(day, 4, 2))
    y = Val(Right$(day, 4)) - 1970
    Select Case m 'Add the number of days for each previous month passed
        Case 2: d = d + 31
        Case 3: d = d + 59
        Case 4: d = d + 90
        Case 5: d = d + 120
        Case 6: d = d + 151
        Case 7: d = d + 181
        Case 8: d = d + 212
        Case 9: d = d + 243
        Case 10: d = d + 273
        Case 11: d = d + 304
        Case 12: d = d + 334
    End Select
    If (y Mod 4) = 2 And m > 2 Then d = d + 1 'add a day if this is leap year and we're past february
    d = (d - 1) + 365 * y 'current month days passed + 365 days per each standard year
    d = d + (y + 2) \ 4 'add in days for leap years passed
    s = d * 24 * 60 * 60 'Seconds are days * 24 hours * 60 minutes * 60 seconds
    ExtendedTimer## = (s + Timer)
End Function
Reply
#20
(03-05-2024, 11:13 PM)Kernelpanic Wrote:
Quote:@mdijkens - You can do these and other date/time related things very easy with the library I posted above.
Just add to your program and calculate differences, leapyear, weekdays, daylight saving, timezones, etc.
Thank you for your hint. The key point about "DateDiff" is, how should I use that for calculations?
I know "DateDiff" from VB-Script and from Visual Basic, and there I used it for calculations in financial programs. I was able to use the result of “DateDiff” when calculating the repayment amount of loans.

Back then, I recalculated all formulas and results in all programs using a calculator, and when "DateDiff" was used, for example, it always delivered a correct result.

There can't be even the slightest mistake in finance. . . otherwise the Third World War will break out.  Tongue
To calculate date differences, you could easily do:

Code: (Select All)
 Dim As _Unsigned _Integer64 date1, date2

date1 = TIM.stamps("1917-09-24 15:52:31") 'seconds since 01-01-0001
date2 = TIM.stamp(2021, 2, 17, 10, 24, 49) 'alternative method

Print TIM.format$(date1)
Print TIM.format$(date2)
Print "Difference is"; date2 - date1; "seconds or"; (date2 - date1) / 86400; "days"

x$ = TIM.dateTime$(date2 - date1, year%, month%, day%, hour%, minute%, seconds%) ' fills vars & returns datetime without -/:
Print "Or"; year%; "years"; month%; "months"; day%; "days"; hour%; "hours"; minute%; "minutes and"; seconds%; "seconds"
End
45y and 2M lines of MBASIC>BASICA>QBASIC>QBX>QB64 experience
Reply




Users browsing this thread: 32 Guest(s)