题目
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。
示例 1:
输入:day = 31, month = 8, year = 2019
输出:“Saturday”
示例 2:
输入:day = 18, month = 7, year = 1999
输出:“Sunday”
示例 3:
输入:day = 15, month = 8, year = 1993
输出:“Sunday”
提示:
给出的日期一定是在 1971 到 2100 年之间的有效日期。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-week
解题思路
法一:暴力
判断是否是闰年,再根据输入的年月日计算过去了多少天。
法二:模拟
把 1971-01-01 为基底 , 开始不断接近 题目给出的日期即可。
法三:蔡勒公式
这个没学过,记一下

注意:由于最 D 可能为负数,需要处理一下。方法很多:这里由 D 计算式发现减的内容最大为 199 所以可以加上一个大于 199 且是 7 的倍数的数。
法四:用现成的包
LocalDate类是Java 8中日期时间功能里表示一个本地日期的类,它的日期是无时区属性的。直接调用即可。
代码
法一
class Solution {public String dayOfTheWeek(int day, int month, int year) {String[] week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};int sum = 0;//输入年之前的天数 for(int i = 1971; i < year; i++){if(is_leap(i)){sum += 366;}else{sum += 365;}}//输入月之前的天数for(int i = 0; i < month-1; i++){sum += monthDays[i];}//月份大于2月时,需要考虑是否加1if(month > 2 && is_leap(year)){sum += 1 + day;}else{sum += day;}//计算周几 int temp = sum%7;//因为,1970的12月31日是周四+3 就可以得到星期几 return week[(temp+3)%7];}//判断闰年public boolean is_leap(int year){if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)){return true;}return false;}
}
法二:
class Solution {public String dayOfTheWeek(int day, int month, int year) {String[] week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};// 靠近当年int days = 365 * (year - 1971) + (year - 1969) / 4;//靠近当月 for (int i = 0; i < month - 1; ++i) {days += monthDays[i];}if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month >= 3) {days += 1;}// 定位到当天days += day;return week[(days + 3) % 7];}
}
法三:
class Solution {public String dayOfTheWeek(int day, int month, int year) {//注意开始是周六!String week[] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"} ;int m ,y;if (month < 3) {m = month + 12;y = year - 1;} else {m = month;y = year;}int index = 0 ;//蔡勒公式 这个公式应该是跟正常的相差1的,也就是算出来相差了一天index = (day + 13 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 ;return week[index] ;}
}
法四
import java.time.LocalDate;
class Solution {public String dayOfTheWeek(int day, int month, int year) {LocalDate localDate = LocalDate.of(year,month,day);String [] s = {null, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday","Sunday"};return s[localDate.getDayOfWeek().getValue()];}
}

















