c#经典题目-- 年、周、日期计算

///

/// 获取一年中指定的一周的开始日期和结束日期。开始日期为星期一。
///

///
/// 年(1 到 9999)
/// 周(1 到 53)
/// 确定首周的规则
/// 当此方法返回时,则包含参数 year 和 weeks 指定的周的开始日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。
/// 当此方法返回时,则包含参数 year 和 weeks 指定的周的结束日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。
///
public static bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule, out DateTime first, out DateTime last)
{
//初始化 out 参数
first = DateTime.MinValue;
last = DateTime.MinValue;

//不用解释了吧...
if (year < 1 | year > 9999)
return false;

//一年最多53周地球人都知道...
if (weeks < 1 | weeks > 53)
return false;

//取当年首日为基准...为什么?容易得呗...
DateTime firstCurr = new DateTime(year, 1, 1);
//取下一年首日用于计算...
DateTime firstNext = new DateTime(year + 1, 1, 1);

//将当年首日星期几转换为数字...星期日特别处理...ISO 8601 标准...
int dayOfWeekFirst = (int)firstCurr.DayOfWeek;
if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;

//得到未经验证的周首日...
first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1);

//周首日是上一年日期的情况...
if (first.Year < year)
{
switch (weekrule)
{
case CalendarWeekRule.FirstDay:
//不用解释了吧...
first = firstCurr;
break;
case CalendarWeekRule.FirstFullWeek:
//顺延一周...
first = first.AddDays(7);
break;
case CalendarWeekRule.FirstFourDayWeek:
//周首日距年首日不足4天则顺延一周...
if (firstCurr.Subtract(first).Days > 3)
{
first = first.AddDays(7);
}
break;
default:
break;
}
}
//得到未经验证的周末日...
last = first.AddDays(7).AddSeconds(-1);
switch (weekrule)
{
case CalendarWeekRule.FirstDay:
//周末日是下一年日期的情况...
if (last.Year > year)
last = firstNext.AddSeconds(-1);
else if (last.DayOfWeek != DayOfWeek.Monday)
last = first.AddDays(7 - (int)first.DayOfWeek).AddSeconds(-1);
break;
case CalendarWeekRule.FirstFourDayWeek:
//周末日距下一年首日不足4天则提前一周...
if (last.Year > year && firstNext.Subtract(first).Days < 4)
{
first = first.AddDays(-7);
last = last.AddDays(-7);
}
break;
default:
break;
}
return true;
}
///

/// 获取指定日期在某年的周数

///

///
///
private int GetWeekOfYear(DateTime dt)
{

GregorianCalendar gc = new GregorianCalendar();

return gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

}

时间: 2024-10-25 13:20:12

c#经典题目-- 年、周、日期计算的相关文章

根据周几计算出月份总年中所有此日的日期值

/// <summary> /// 根据年月获取所有周几 /// </summary> /// <param name="y">年</param> /// <param name="m">月份字符串</param> /// <param name="week">周几字符串(0:—....6:日)</param> /// <returns>时

iOS学习笔记37-时间和日期计算

一.时间和日期计算 我们在应用开发中,时常需要和时间打交道,比如获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有如下几个: 1. NSDate:表示一个绝对的时间点 2. NSTimeZone:时区信息 3. NSLocale:本地化信息 4. NSDateComponents:一个封装了具体年月日.时秒分.周.季度等的类 5. NSCalendar:日历类,它提供了大部分的日期计算接口 6. NSDateFormatter:用来在日期和字符串之间转换 二.NSDate

学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足结合律经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这 里的操作是对所有点同时进行的.其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心.如果对每个点分别进行模拟,那么m个操作总共耗时 O(mn).利用矩阵乘法可

十个利用矩阵乘法解决的经典题目

转载自    Matrix67: The Aha Moments 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个

JS nodeJs 的日期计算

date-utils 前端引用 <script type="text/javascript" src="date-utils.min.js"></script> 下载传送门,猛击我 NODEJS服务端项目调用 $ cnpm install date-utils require('date-utils'); nodejs版本要求>0.6 API : Static Methods 静态方法 Date.today(); // today, 0

矩阵乘法的经典题目_源自Matrix67_

嘛,都刷一遍好辣. 矩阵Am?n就是一个m行n列的数表. 考虑矩阵的乘法: C=A?B=∑aik?bkj 那么对于矩阵A的要求就是:A为m * n的矩阵 对于矩阵B的要求就是:B为n * p的矩阵 乘得的矩阵C的规模:m * p的矩阵 矩阵乘法是不满足交换律的.但它满足结合律和分配律. 经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转 然后盗图 考虑实际上这个变换对应着一个类似于线性变换的东西,我们显然是可以用矩阵来搞的. 而对于翻转

CalendarHelper日期计算工具,各种日期的获取和计算

今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的. package com.ran.interview; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * @auth

动态规划经典题目:最大连续子序列和

最大连续子序列和问题 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20. 注:为方便起见,如果所有整数均为负数,则最大子序列和为0. 解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法

SQL Server日期计算

通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期. 在使用本文中的例子之前,你必须注意以下的问题.大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定.第一

java实现的日期计算

这里讲的日期计算比较偏,用到的地方很少(比如获取今天所在周的周一或者周日,获取今天是本月的第几周...),这些方法是以前做项目遗留下来的,现在整理一下,跟大家分享. 工具类主要有一下方法: public static Date getFirstMondayOfMonth(String dateString, String dateFormat) throws Exception 获取指定月份的第一个星期一,比如2014-12 月的第一个周一是2014-12-01 public static in