jkhsjdhjs

Wochentagsberechnung

Feb 28th, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. data Month = January | February | March | April | May | June | July | August | September | October | November | December deriving (Show, Eq, Enum)
  2. data DoW = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday deriving (Show, Enum)
  3.  
  4. (.:) :: Month -> Int -> Month
  5. a .: b = toEnum $ flip mod 12 $ 12 + fromEnum a - b
  6.  
  7. calc_leapyear :: Int -> Bool
  8. calc_leapyear y = (y `mod` 4 == 0 && y `mod` 100 /= 0) || (y `mod` 4 == 0 && y `mod` 400 == 0)
  9.  
  10. get_max_days :: Month -> Int
  11. get_max_days m  | m == January || m == March || m == May || m == July || m == August || m == October || m == December = 31
  12.                 | m == April || m == June || m == September || m == November = 30
  13.                 | otherwise = 28
  14.  
  15. day_digit :: Int -> Int
  16. day_digit d = d `mod` 7
  17.  
  18. month_digit :: Month -> Int
  19. month_digit January = 0
  20. month_digit a = flip mod 7 $ (get_max_days $ a .: 1) `mod` 7 + (month_digit $ a .: 1)
  21.  
  22. year_digit :: Int -> Int
  23. year_digit y = ((y `mod` 100) + ((y `mod` 100) `quot` 4)) `mod` 7
  24.  
  25. century_digit :: Int -> Int
  26. century_digit y = (3 - ((y `quot` 100) `mod` 4)) * 2
  27.  
  28. ly_correction :: Month -> Int -> Int
  29. ly_correction m y   | calc_leapyear(y) && (m == January || m == February) = -1
  30.                     | otherwise = 0
  31.  
  32. calc_day_of_week :: Int -> Month -> Int -> DoW
  33. calc_day_of_week d m y = toEnum $ flip mod 7 $ day_digit d + month_digit m + year_digit y + century_digit y + ly_correction m y
Advertisement
Add Comment
Please, Sign In to add comment