A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 threederek 于 2014-3-19 16:16 编辑

//公式:W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + Sum    Y是年份数,sum是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。两个公式中的[...]均指只取计算结果的整数部分。算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
      
  1. private static void CalDayOfTheWeek(string date, int sum)
  2.         {
  3.             //通过字符串截取获得四位年份数,并转换为整数类型
  4.             int year = Convert.ToInt32(date.Substring(0, 4));
  5.             //计算是星期几
  6.             int week = (year - 1) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + sum;
  7.             int dayOfTheWeek = week % 7;

  8.             //通过switch判断把数字转换为字符串输出星期
  9.             string weekStr = null;
  10.             switch (dayOfTheWeek)
  11.             {
  12.                 case 1:
  13.                     weekStr = "一";
  14.                     break;
  15.                 case 2:
  16.                     weekStr = "二";
  17.                     break;
  18.                 case 3:
  19.                     weekStr = "三";
  20.                     break;
  21.                 case 4:
  22.                     weekStr = "四";
  23.                     break;
  24.                 case 5:
  25.                     weekStr = "五";
  26.                     break;
  27.                 case 6:
  28.                     weekStr = "六";
  29.                     break;
  30.                 case 0:
  31.                     weekStr = "日";
  32.                     break;
  33.             }

  34.             Console.WriteLine("今天是星期",weekStr);
  35.         }
复制代码
为了方便理解,以下是全部代码了
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace test10
  6. {
  7.     class Program
  8.     {
  9.         //编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。
  10.         static void Main(string[] args)
  11.         {
  12.             Console.WriteLine("请按yyyy-MM-dd的格式输入日期:");
  13.             string date = Console.ReadLine();

  14.             //定义闰年和平年每个月的天数数组
  15.             int[] leapYear = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  16.             int[] commonYear = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

  17.             //判断是否是闰年
  18.             if (IsLeapYear(date))
  19.             {
  20.                 //CalDays(date, leapYear);
  21.                 CalDayOfTheWeek(date, CalDays(date,leapYear));

  22.             }
  23.             else
  24.             {
  25.                 //CalDays(date, commonYear);
  26.                 CalDayOfTheWeek(date, CalDays(date, commonYear));
  27.             }
  28.             
  29.             
  30.             Console.ReadKey();
  31.         }

  32.         //计算该天是星期几
  33.         //公式来自网络:W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D    Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。两个公式中的[...]均指只取计算结果的整数部分。算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
  34.         private static void CalDayOfTheWeek(string date, int sum)
  35.         {
  36.             //通过字符串截取获得四位年份数,并转换为整数类型
  37.             int year = Convert.ToInt32(date.Substring(0, 4));
  38.             //计算是星期几
  39.             int week = (year - 1) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + sum;
  40.             int dayOfTheWeek = week % 7;

  41.             //通过switch判断把数字转换为字符串输出星期
  42.             string weekStr = null;
  43.             switch (dayOfTheWeek)
  44.             {
  45.                 case 1:
  46.                     weekStr = "一";
  47.                     break;
  48.                 case 2:
  49.                     weekStr = "二";
  50.                     break;
  51.                 case 3:
  52.                     weekStr = "三";
  53.                     break;
  54.                 case 4:
  55.                     weekStr = "四";
  56.                     break;
  57.                 case 5:
  58.                     weekStr = "五";
  59.                     break;
  60.                 case 6:
  61.                     weekStr = "六";
  62.                     break;
  63.                 case 0:
  64.                     weekStr = "日";
  65.                     break;
  66.             }

  67.             Console.WriteLine("今天是星期",weekStr);
  68.         }

  69.         //计算日期是一年中的第几天
  70.         private static int CalDays(string dateStr, int[] leapYear)
  71.         {
  72.             //通过字符串得到日期对象,并获得日和月
  73.             DateTime date = Convert.ToDateTime(dateStr);
  74.             int month = date.Month;
  75.             int day = date.Day;

  76.             //根据月份累加平闰年每个月天数数组中的数据,最后加上相应的日期得到累计日期
  77.             int sum = 0;
  78.             for (int i = 0; i < month -1 ; i++)
  79.             {
  80.                 sum += leapYear[i];
  81.             }
  82.             sum += day;

  83.             Console.WriteLine("该日期为今年的第{0}天",sum);
  84.             return sum;

  85.         }

  86.         //判断是否是闰年,年份数能被4整除并且不能被100整除或者年份数能被400整除,为真则是闰年
  87.         private static bool IsLeapYear(string date)
  88.         {
  89.             int year = Convert.ToInt32(date.Substring(0, 4));

  90.             return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
  91.         }
  92.     }
  93. }
复制代码





6 个回复

倒序浏览
学习一下
回复 使用道具 举报
让我来解释一下这个公式
int week = (year - 1) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + sum;
首先我觉得这样写更易理解一点
int days =(year - 1)*365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + sum;
days表示总天数(从第0年0月1日),为什么呢?
1.先把每一年看成365天(暂不考虑闰年),这样就得到了=(year - 1)*365  + sum天
2.考虑每4年是一个闰年(能被4整出,不考虑100,400的情况)所以再+ ((year - 1) / 4)
3.再考虑能被100整出的不是闰年,所以 - ((year - 1) / 100)
4.最后能被400整出的也是闰年,所以+ ((year - 1) / 400)
经过前四步就得到所有的天数days
weekday=days%7;得到weekday表示星期几
又因为(a+b)%7等价于a%7+b%7
weekday=(year - 1)*365%7 + ((year - 1) / 4) %7- ((year - 1) / 100) %7+ ((year - 1) / 400)%7 + sum%7
而365%7=1故得到LZ的式子(LZ的week表示所有剩余的天数,对7取余后得到weekday)

int week = (year - 1) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + sum
weekday=week%7
回复 使用道具 举报
贰的23次方 发表于 2014-3-19 16:13
让我来解释一下这个公式
int week = (year - 1) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / ...

为了方便大家理解 代码全部贴出来了
回复 使用道具 举报
学习一下哈。
回复 使用道具 举报
很不错,学习一下
回复 使用道具 举报
很不错哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马