This function returns the weekday of any date between 1700 and 2199.
print(try dayOfTheWeek("28.09.1964")) // Prints "Monday"
print(try dayOfTheWeek("12.03.2014")) // Prints "Wednesday"
print(try dayOfTheWeek("31.12.1980")) // Prints "Wednesday"| /// please insert date in DD.MM.YYYY pattern | |
| func dayOfTheWeek(_ string: String) throws -> String { | |
| guard string.characters.count == 10 else { throw DayOfTheWeekError.wrongFormat("length") } | |
| var index0 = string.startIndex | |
| var index1 = string.index(index0, offsetBy: 2) | |
| guard let dayCode = UInt16(string[index0..<index1]) else { throw DayOfTheWeekError.wrongFormat("day") } | |
| index0 = string.index(index1, offsetBy: 1) | |
| index1 = string.index(index0, offsetBy: 2) | |
| guard let monthCode = UInt16(string[index0..<index1]) else { throw DayOfTheWeekError.wrongFormat("month") } | |
| index0 = string.index(index1, offsetBy: 1) | |
| index1 = string.index(index0, offsetBy: 4) | |
| guard let yearCode = UInt16(string[index0..<index1]) else { throw DayOfTheWeekError.wrongFormat("year") } | |
| let leapYear = yearCode % 4 == 0 ? (yearCode % 100 == 0 ? (yearCode % 400 != 0) : true) : false | |
| var result : UInt16 = dayCode | |
| switch monthCode { | |
| case 1 : result += leapYear ? 5 : 6 | |
| case 2 : result += leapYear ? 1 : 2 | |
| case 3 : result += 2 | |
| case 4 : result += 5 | |
| case 5 : result += 0 | |
| case 6 : result += 3 | |
| case 7 : result += 5 | |
| case 8 : result += 1 | |
| case 9 : result += 4 | |
| case 10 : result += 6 | |
| case 11 : result += 2 | |
| case 12 : result += 4 | |
| default : throw DayOfTheWeekError.wrongFormat("month") | |
| } | |
| let y = yearCode % 100 | |
| result += (y / 4) + y | |
| switch yearCode / 100 { | |
| case 17 : result += 5 | |
| case 18 : result += 3 | |
| case 19 : result += 1 | |
| case 20 : result += 0 | |
| case 21 : result += 5 | |
| default : throw DayOfTheWeekError.wrongFormat("year") | |
| } | |
| switch result % 7 { | |
| case 1 : return "Monday" | |
| case 2 : return "Tuesday" | |
| case 3 : return "Wednesday" | |
| case 4 : return "Thursday" | |
| case 5 : return "Friday" | |
| case 6 : return "Saturday" | |
| case 0 : return "Sunday" | |
| default : fatalError("\(result % 7) < 0 ?... because it's not in 0..<7.") | |
| } | |
| } | |
| enum DayOfTheWeekError : Error { | |
| case wrongFormat(String) | |
| } |