Home > Software design >  VB.Net Easter Sunday Calculation wrong date output
VB.Net Easter Sunday Calculation wrong date output

Time:03-04

I am trying to write an application that allows a user to input the year and the program will output the date (month and day) of Easter Sunday for the year.

But I keep on getting the wrong output for the day and sometimes the month

here is my code:

    Dim year As Integer
    Dim month As Integer
    Dim day As Integer
    Dim a, b, c, d, e, f, g, h, i, j, k As Integer

    Console.WriteLine("Enter a year from 1900 to 2099 to calculate the date of Easter Sunday: ") 
    year = Integer.Parse(Console.ReadLine())

    'Calculation of the date
    a = year Mod 19   1
    b = year / 100
    c = year Mod 100
    d = b / 4
    e = b Mod 4
    f = (8 * b   13) / 25
    g = (19 * a   b - d - f   15) Mod 30
    h = c / 4
    i = c Mod 4
    j = (a   11 * g) / 319
    k = (2 * e   2 * h - i - g   j   32) Mod 7
    month = (g - j   k   90) / 25
    day = (g - j   k   month   19) Mod 32

    Console.WriteLine("") 

    'Shows the result
    If month = 1 Then
        Console.WriteLine("Easter Sunday in year " & year & " is January " & day) 

    ElseIf month = 2 Then
        Console.WriteLine("Easter Sunday in year " & year & " is February " & day) 

    ElseIf month = 3 Then
        Console.WriteLine("Easter Sunday in year " & year & " is March " & day) 

    ElseIf month = 4 Then
        Console.WriteLine("Easter Sunday in year " & year & " is April " & day) 

    ElseIf month = 5 Then
        Console.WriteLine("Easter Sunday in year " & year & " is May " & day) 

    ElseIf month = 6 Then
        Console.WriteLine("Easter Sunday in year " & year & " is June " & day) 

    ElseIf month = 7 Then
        Console.WriteLine("Easter Sunday in year " & year & " is July " & day) 

    ElseIf month = 8 Then
        Console.WriteLine("Easter Sunday in year " & year & " is August " & day) 

    ElseIf month = 9 Then
        Console.WriteLine("Easter Sunday in year " & year & " is September " & day) 

    ElseIf month = 10 Then
        Console.WriteLine("Easter Sunday in year " & year & " is October " & day) 

    ElseIf month = 11 Then
        Console.WriteLine("Easter Sunday in year " & year & " is November " & day) 

    ElseIf month = 12 Then
        Console.WriteLine("Easter Sunday in year " & year & " is December " & day)

    End If

the output

  Enter a year from 1900 to 2099 to calculate the date of Easter Sunday:
  1900

  Easter Sunday in year 1900 is April 8

The output should be April 15

  Enter a year from 1900 to 2099 to calculate the date of Easter Sunday:
  1900

  Easter Sunday in year 1901 is April 25

The output should be April 7

CodePudding user response:

I am not going to get into how your calculation is wrong, but I guess you are using enter image description here

c# enter image description here

The big issue is the division operator / is not the same in both languages. In VB.Net you should change to the \ Operator

Fixed converted c# to vb.net code:

Public Shared Function EasterSunday(ByVal year As Integer) As DateTime
    Dim day As Integer = 0
    Dim month As Integer = 0
    Dim g As Integer = year Mod 19
    Dim c As Integer = year \ 100
    Dim h As Integer = (c - (c \ 4) - ((8 * c   13) \ 25)   19 * g   15) Mod 30
    Dim i As Integer = h - (h \ 28) * (1 - (h \ 28) * (29 \ (h   1)) * ((21 - g) \ 11))
    day = i - ((year   (year \ 4)   i   2 - c   (c \ 4)) Mod 7)   28
    month = 3
    If day > 31 Then
        month  = 1
        day -= 31
    End If
    Return New DateTime(year, month, day)
End Function

and you can get rid of that ridiculous If Else chain, and just use some string formatting

Dim easterSundayDate = EasterSunday(year)
Console.WriteLine($"Easter Sunday in year {easterSundayDate:yyyy} is {easterSundayDate:MMMM} {easterSundayDate:dd}")

Easter Sunday in year 1900 is April 15

Finally, do you realize you are marginalizing the Eastern Orthodox? :)

CodePudding user response:

Look at the comments,

Public Shared Function EasterCalc(whYear As Integer) As DateTime
    'http://catholicism.about.com/od/holydaysandholidays/f/Calculate_Date.htm
    'http://en.wikipedia.org/wiki/Computus#Algorithms

    'easter - code copied, haven't a clue why it does what it does
    '         but it does work
    'VB .Net implementation of:
    'http://aa.usno.navy.mil/faq/docs/easter.php

    Dim y As Integer = whYear
    Dim c, d, i, j, k, l, m, n As Integer
    c = y \ 100
    n = y Mod 19
    k = (c - 17) \ 25
    i = c - c \ 4 - (c - k) \ 3   19 * n   15
    i = i Mod 30
    i = i - (i \ 28) * (1 - (i \ 28) * (29 \ (i   1)) * ((21 - n) \ 11))
    j = y   y \ 4   i   2 - c   c \ 4
    j = j Mod 7
    l = i - j
    m = 3   (l   40) \ 44
    d = l   28 - 31 * (m \ 4)
    Dim rv As DateTime = New DateTime(y, m, d)
    Return rv
End Function
  • Related