一个日期是星期几

#include <stdio.h>
#include <stdlib.h>

/*
	输入一个日期,输出该日期是星期几。
*/

int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int getWeekDay(int year, int month, int day);
int isGoodYear(int year);
int isGoodMonth(int month);
int isGoodDay(int year, int month, int day);
int isLeapYear(int year);
int dayOfYear(int year, int month, int day);
int daysBetweenYear(int year1, int year2);
int daysBetweenDays(int year1, int month1, int day1, int year2, int month2, int day2);

int main(){
	int year, month, day;
	while (fflush(stdin), scanf("%d%d%d", &year, &month, &day) != EOF){
		if (isGoodYear(year) && isGoodMonth(month) && isGoodDay(year, month, day))	//判断输入是否合法
			printf("%d\n", getWeekDay(year,month,day));
		else
			printf("Please input a right date.\n");
	}
	system("pause");
	return 0;
}

int getWeekDay(int year, int month, int day){
	//基准取2016/1/3,周日
	//SUN返回0
	//MON-SAT分别返回1-6
	if ((year >= 2016) && (month >= 1) && (day >= 3))
		return daysBetweenDays(2016, 1, 3, year, month, day) % 7;
	else
		return (7 - daysBetweenDays(year, month, day, 2016, 1, 3) % 7) % 7;
}

int daysBetweenDays(int year1, int month1, int day1, int year2, int month2, int day2){
	//日期1<日期二为负数
	//日期1>日期二为正数
	int days1 = dayOfYear(year1, month1, day1);
	int days2 = dayOfYear(year2, month2, day2);
	int days3 = daysBetweenYear(year1, year2);
	int totalDays = days2 + days3 - days1;
	return totalDays;
}

int daysBetweenYear(int year1, int year2){
	//year1 < year2为正数
	//year1 > year2为负数
	int maxYear = (year1 > year2) ? year1 : year2;
	int minYear = (year1 > year2) ? year2 : year1;
	int totalDays = 0;
	for (int i = minYear; i < maxYear; ++i)
		if (isLeapYear(i))
			totalDays += 366;
		else
			totalDays += 365;
	if (minYear == year1)
		return totalDays;
	else
		return -totalDays;
}

int dayOfYear(int year, int month, int day){//当年第几天
	int total = 0;
	for (int i = 0; i < month - 1; ++i)
		total += monthDays[i];
	total += day;
	if (isLeapYear(year) && (month > 2))
		total++;
	return total;
}

int isLeapYear(int year){
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		return 1;
	else
		return 0;
}

int isGoodYear(int year){
	if (year >= 1900)
		return 1;
	else
		return 0;
}

int isGoodMonth(int month){
	if ((month >= 1) && (month <= 12))
		return 1;
	else
		return 0;
}

int isGoodDay(int year, int month, int day){
	switch (month)
	{
	case 2:
		if (isLeapYear(year))
			if ((day >= 1) && (day <= 29))
				return 1;
			else if ((day >= 1) && (day <= 28))
				return 1;
			else
				return 0;
	case 4:
	case 6:
	case 9:
	case 11:
		if ((day >= 1) && (day <= 30))
			return 1;
		else
			return 0;
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		if ((day >= 1) && (day <= 31))
			return 1;
		else
			return 0;
	default:
		printf("month error in day judge.\n");
		return 0;
	}
}

  

时间: 2024-10-26 08:09:28

一个日期是星期几的相关文章

输入一个日期,输出该日期是星期几

假定输入日期合法正确. 先找一个参考日期,找星期天的日期为最好.我一时没想到就选了今天,星期一,也不错.然后求出输入日期与参考日期之间间隔的天数n,n为负时则表示输入日期在参考日期之前,n为正时则表示输入日期在参考日期之后.因为星期为循环星期1到星期天,又根据补码的原理,可知n = ((n % 7) +  8) % 7, 此时的n为几则是星期几.(PS:星期天用0来表示,因为我选的是参考日期是星期一所以是+8,如果选的是星期天则是+7). 1 //给定一个日期,求这个日期是星期几? 2 #inc

关于 cron 日期 和星期 互排斥

关于cronExpression网上可以搜到一大堆官方文档及其翻译,大部分都是出自同一篇转文,翻译的部分充满了错误和语病,尤其是关于问号(?)的解释部分,实在是没法看.还是自己研究一下吧. 官方文档上提到问号时是这样说的: The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when y

Java日历模型:输入一个日期,控制台显示

1 package com.zhen.calendar; 2 3 import java.text.DateFormat; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; 7 import java.util.GregorianCalendar; 8 import java.util.Scanner; 9 10 /* 11 * 输入一个日期,控制台显示 12 *

转- 关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

Swift根据日期字符串返回日期是星期几

最近在做的一个IOS项目中需要根据日期得出日期代表的是星期几,日期以字符串的形式获得,于是该方法可以简单描述如下: /* * 根据日期格式字符串返回日期代表星期几 * 参数:dateTime,字符串类型,日期格式字符串,格式为"yyyy-MM-dd HH:mm:ss" * 返回值:日期代表星期几,Int类型,星期一到星期日分别表示为:1-7 */ func getWeekDay(dateTime:String) ->Int 简单百度了一下,又大致浏览了一下官方API文档,得知NS

关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)(一)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

VBA 操作 Excel 生成日期及星期

直接上代码~~ 1.  在一个 Excel 生成当月或当年指定月份的日期及星期 ' 获取星期的显示 Function disp(i As Integer) Select Case i Case 1 disp = "一" Case 2 disp = "二" Case 3 disp = "三" Case 4 disp = "四" Case 5 disp = "五" Case 6 disp = "六&q

关于时间,日期,星期,月份的算法(Java中Calendar的用法)(一)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("如今时间

获取某一个日期所在周的第一天

由于统计需要,先要获取指定日期来获取该日期所在周的第一天,从而算出所在周是哪一天至哪一天.先看下面代码,是获取当天的日期. DateTime.Today 如果不是当天,而是指定日期,需要把它转换为日期. DateTime dt = Convert.ToDateTime("2013-08-02"); 如果,你把指定的日期,是一个非规则的日期格式的字符串,那得使用DateTime.ParseExact来转换http://www.cnblogs.com/insus/p/3231007.htm