我这个方法有点小取巧,只取1900-01-01年后的数据,之前的的日期需要重新计算一下。
1、先取出输入的日期距离1900-01-01的天数
private static int GetDays(int year, int month, int day)
{
//1900-1-1是星期一
int result = 0;
int[] month31 = {1,3,5,7,8,10,12};
int[] month30 = {4,6,9,11};
const int YEAR = 1900;
const int MONTH = 1;
const int DAY = 1;
//先按整年计算*****************************************
result += (year - YEAR) * 365;
for (int i = YEAR; i < year; i++)
{
if (IsLeapYear(i))
{
++result;
}
}
//计算月份********************************************
if (month > MONTH)
{
for (int i = MONTH; i < month; i++)
{
if (i == 2 && IsLeapYear(year))
{
result += 29;
}
else
{
result += 28;
}
if (month30.Contains(i))
{
result += 30;
}
if (month31.Contains(i))
{
result += 31;
}
}
}
else
{
//月份相等的情况,不可能有月份小于1,不需要做任何运算,在下面的日计算直接计算即可
}
//计算日*********************************
result += day - DAY;
return result;
}
2、将天数差对7取余,比如相差1900-01-07和1900-01-01相差7天,那么取余得到0,说明是星期天,
如果是1900-01-08,则取余为1,说明和1900-01-01是同一个星期,即星期一
/// <summary>
/// 根据天数差获取是星期几
/// </summary>
/// <param name="days">天数差</param>
/// <param name="weekInt">取余后的数</param>
/// <returns></returns>
private static string GetWeekDay(int days,out int weekInt)
{
Dictionary<int, string> weekDic = new Dictionary<int, string>();
weekDic.Add(1, "星期一");
weekDic.Add(2, "星期二");
weekDic.Add(3, "星期三");
weekDic.Add(4, "星期四");
weekDic.Add(5, "星期五");
weekDic.Add(6, "星期六");
weekDic.Add(7, "星期天");
weekInt = days % 7 == 0 ? 7 : days % 7;
return weekDic[weekInt];
}
3、输出结果
Console.WriteLine("请输入一个日期:");
string dateStr = Console.ReadLine();
string[] dateArray = dateStr.Split('-');
int year = int.Parse(dateArray[0]);
int month = int.Parse(dateArray[1]);
int day = int.Parse(dateArray[2]);
int days = GetDays(year, month, day);
int weekInt = 0;
Console.WriteLine("距离1900-1-1,有" + days + "天的时间");
Console.WriteLine("这一天是" + GetWeekDay(days, out weekInt));
可以用在js计算星期上。