C#跳过工作日,计算几个工作日之后到期的方法
需求:消费者投诉企业,企业在2个工作日之内做出应答。
分析:1.工作日要刨去周末和法定节假日,而且每年的节假日不一样。
2.消费者可以在任意时间发起投诉,如果在非工作日发起了投诉,那么计算时间应该从工作日开始计算,就要刨去当日的时和分。
以下是代码:
public class HolidayHelper
{
/// <summary>
/// 判断法定工作日
/// </summary>
/// <param name="dt">时间</param>
/// <returns>0上班,1不需要上班的周末(也包括节假日),2法定节假日</returns>
public static int IsHolidayOrWeek(DateTime dt)
{
//特殊的周末(周末却上班)
string[] specalWeek2009 = { "0104", "0124", "0201", "0531", "0927", "1010" };
string[] specalWeek2010 = { "0220", "0221", "0612", "0613", "0919", "0925", "0926", "1009" };
string[] specalWeek2011 = { "0130", "0212", "0402", "1008", "1009" };
string[] specalWeek2012 = { "0129", "0331", "0401", "0428", "0929" };
string[] specalWeek2013 = { "0105", "0106", "0216", "0217", "0407", "0427", "0428", "0608", "0609", "0922", "0929", "1012" };
string[] specalWeek2014 = { "0126", "0208", "0504", "0928", "1011" };
string[] specalWeek2015 = { "0104", "0215", "0228", "0906", "1010" };
string[] specalWeek2016 = { "0206", "0214", "0612", "0918", "1008", "1009" };
string[] specalWeek2017 = { "0122", "0204", "0401", "0527", "0930" };
//法定假日
string[] holiday2009 = { "0101", "0102", "0103", "0125", "0126", "0127", "0128", "0129", "0130", "0131", "0404", "0405", "0406", "0501", "0502", "0503", "0528", "0529", "0530", "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", };
string[] holiday2010 = { "0101", "0102", "0103", "0213", "0214", "0215", "0216", "0217", "0218", "0219", "0403", "0404", "0405", "0501", "0502", "0503", "0614", "0615", "0616", "0922", "0923", "0924", "1001", "1002", "1003", "1004", "1005", "1006", "1007" };
string[] holiday2011 = { "0101", "0102", "0103", "0202", "0203", "0204", "0205", "0206", "0207", "0208", "0403", "0404", "0405", "0430", "0501", "0502", "0604", "0605", "0606", "0910", "0911", "0912", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2012 = { "0101", "0102", "0103", "0122", "0123", "0124", "0125", "0126", "0127", "0128", "0402", "0403", "0404", "0429", "0430", "0501", "0622", "0623", "0624", "0930", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2013 = { "0101", "0102", "0103", "0209", "0210", "0211", "0212", "0213", "0214", "0215", "0404", "0405", "0406", "0429", "0430", "0501", "0610", "0611", "0612", "0919", "0920", "0921", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2014 = { "0101", "0131", "0201", "0202", "0203", "0204", "0205", "0206", "0405", "0406", "0407", "0501", "0502", "0503", "0602", "0908", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2015 = { "0101", "0102", "0103", "0218", "0219", "0220", "0221", "0222", "0223", "0224", "0404", "0405", "0406", "0501", "0502", "0503", "0620", "0621", "0622", "0903", "0904", "0905", "0927", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2016 = { "0101", "0207", "0208", "0209", "0210", "0211", "0212", "0213", "0404", "0501", "0502", "0609", "0610", "0611", "0915", "0916", "0917", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };
string[] holiday2017 = { "0101", "0102", "0127", "0128", "0129", "0130", "0131", "0201", "0202", "0403", "0404", "0501", "0529", "0530", "1001", "1002", "1003", "1004", "1005", "1006", };
bool isHoildayOrWeek = false;
//取年
string weekYear = dt.Year.ToString();
//取月日
string[] weekDate = { dt.ToString("MMdd") };
//判断周末
if ((int)dt.DayOfWeek == 0 || (int)dt.DayOfWeek == 6)
{
//周末是否需要上班
switch (weekYear)
{
case "2009":
isHoildayOrWeek = specalWeek2009.Intersect(weekDate).Count() == 0;
break;
case "2010":
isHoildayOrWeek = specalWeek2010.Intersect(weekDate).Count() == 0;
break;
case "2011":
isHoildayOrWeek = specalWeek2011.Intersect(weekDate).Count() == 0;
break;
case "2012":
isHoildayOrWeek = specalWeek2012.Intersect(weekDate).Count() == 0;
break;
case "2013":
isHoildayOrWeek = specalWeek2013.Intersect(weekDate).Count() == 0;
break;
case "2014":
isHoildayOrWeek = specalWeek2014.Intersect(weekDate).Count() == 0;
break;
case "2015":
isHoildayOrWeek = specalWeek2015.Intersect(weekDate).Count() == 0;
break;
case "2016":
isHoildayOrWeek = specalWeek2016.Intersect(weekDate).Count() == 0;
break;
case "2017":
isHoildayOrWeek = specalWeek2017.Intersect(weekDate).Count() == 0;
break;
}
}
if (isHoildayOrWeek)
{
return 1;
}
//判断法定节假日
switch (weekYear)
{
case "2009":
isHoildayOrWeek = holiday2009.Intersect(weekDate).Count() > 0;
break;
case "2010":
isHoildayOrWeek = holiday2010.Intersect(weekDate).Count() > 0;
break;
case "2011":
isHoildayOrWeek = holiday2011.Intersect(weekDate).Count() > 0;
break;
case "2012":
isHoildayOrWeek = holiday2012.Intersect(weekDate).Count() > 0;
break;
case "2013":
isHoildayOrWeek = holiday2013.Intersect(weekDate).Count() > 0;
break;
case "2014":
isHoildayOrWeek = holiday2014.Intersect(weekDate).Count() > 0;
break;
case "2015":
isHoildayOrWeek = holiday2015.Intersect(weekDate).Count() > 0;
break;
case "2016":
isHoildayOrWeek = holiday2016.Intersect(weekDate).Count() > 0;
break;
case "2017":
isHoildayOrWeek = holiday2017.Intersect(weekDate).Count() > 0;
break;
}
if (isHoildayOrWeek)
{
return 2;
}
return 0;
}
/// <summary>
/// 工作日时间差
/// </summary>
/// <param name="days">几个工作日后</param>
/// <returns>延迟毫秒数</returns>
public static double GetDelpyTime(int days)
{
int sign = 0;
for (int i = 0; i < days; i++)
{
if (i == 0 && IsHolidayOrWeek(DateTime.Now.AddDays(i)) > 0)
{
//非工作日发起的投诉,要抹掉小时和分钟
sign = 1;
}
if (IsHolidayOrWeek(DateTime.Now.AddDays(i)) > 0)
{
days = days + 1;
};
}
TimeSpan ts = new TimeSpan();
if (sign == 1)
{
ts = (DateTime.Now.AddDays(days) - DateTime.Now.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute));
}
else
{
ts = DateTime.Now.AddDays(days) - DateTime.Now;
}
return ts.TotalMilliseconds;
}
}
C#跳过工作日,计算几个工作日之后到期的方法的更多相关文章
- Flink实时计算pv、uv的几种方法
本文首发于:Java大数据与数据仓库,Flink实时计算pv.uv的几种方法 实时统计pv.uv是再常见不过的大数据统计需求了,前面出过一篇SparkStreaming实时统计pv,uv的案例,这里用 ...
- C++11用于计算函数对象返回类型的统一方法
[C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...
- Java日期时间API系列38-----一种高效的工作日计算计算方法
如果没有节日放假调休的话,工作日很好计算,周一到周五就是工作日,但因为有节日放假调休,使得这个计算需要外部放假安排数据来支持.计算原理: 先按照放假安排数据计算,再按照周一周五计算. 下面以Local ...
- PostgreSQL 当月最后一天的工作日 , 计算日期是星期几
可以用pg自带函数select extract(dow from current_date),之所以没用主要是展示一下通过数学方法计算日期的原理. drop function if exists ge ...
- Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法
最近又遇到了这种问题,百度了好久,发现有人说要在action的路径里面写Servlet文件的绝对路径,比如说,单独打开servlet的地址为http://localhost:8080/TomcatTe ...
- form表单action提交表单,页面不跳转且表单数据含文件的处理方法
在最近的项目中需要将含 input[type='file']的表单提交给后台 ,并且后台需要将文件存储在数据库中.之前所用的方法都是先将文件上传到七牛服务器上,然后七牛会返回文件的下载地址,在提交表单 ...
- iOS从App跳转至系统设置菜单各功能项的编写方法讲解
跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...
- 用Regex类计算一个字符串出现次数是最好方法【转载】
我的一个朋友问我,怎么在c#或vb.net中,计算一个字符串中查找另一个字符串中出现的次数,他说在网上打了好多方法,我看了一下,有的是用replace的方法去实现,这种方法不是太好,占资源太大了.其实 ...
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
最近做项目,要用到js的加.减.乘.除的计算,发现js浮点数计算会有一些误差. 网上有很多文章都有js浮点数计算误差的解决方法,说能解决这个问题,But…….比如一个加法函数,如下: function ...
随机推荐
- 微课制作软件Camtasia中如何添加并编辑字幕?
除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ...
- CSP2020 游记
Day -28 后天就初赛了,考了一套模拟题,自闭,心态爆炸,感觉退役不远了 Day -26(初赛) 香农是谁??? 手写随机nth_element与O(n)的哈希表??? 阅读程序T2时间复杂度分析 ...
- Ubuntu sudo 出现unable to resolve host 解决方法
Ubuntu sudo 出现unable to resolve host 解决方法 Ubuntu环境, 假设这台机器名字叫abc(机器的hostname), 每次执行sudo 就出现这个警告讯息: s ...
- 【模版】【P3806】点分治
(7.17)早就想学点分治了--今天状态不太在线,眯一会写篇笔记来理理思路. ------------------------------------------------------------- ...
- G - Pyramid 题解(打表)
题目链接 题目大意 t组数据,给你一个n(n<=1e9)求高度为n的等边三角形,求里面包含了多少个等边三角形 题目思路 打表找规律,然而我一直没找到规律. 看到题解恍然大悟,答案就是C(n+3, ...
- Codeforces Round #631 (Div. 1) B. Dreamoon Likes Sequences 题解(思维+求贡献)
题目链接 题目大意 让你构造一个严格单调上升的数组a满足\(1<=a_1<a_2<....a_n<=d\) 而且要使得这个数组的异或前缀和也满足严格单调上升,求有多少个满足条件 ...
- C语言讲义——冒泡排序(bubble sort)
冒泡排序三步走: 循环 交换 回一手 一个数和其它数比较(循环) 每个数都要做这种比较(再一层循环) 准备工作 #include <stdio.h> void sort(int arr[] ...
- cheat.sh在手,天下我有
前言 作为程序员需要了解的东西有很多,日常编码和写脚本脱离不开各式语言与 Linux 命令.为了记住一些杂乱的或不被经常使用的知识点,我们迫切需要一个"小抄"/备忘录,小抄内容多了 ...
- (1)Consul在linux环境的集群部署
1.Consul概念 1.1什么是Consul? Consul是一种服务网格解决方案,是HashiCorp公司推出的开源组件,由Go语言开发,部署起来很容易,只需要极少的可执行程序和配置.同时Cons ...
- Java动态代理设计模式
本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理. 什么是代理模式 就是为其他对象提供一种代理以控制对这个对象的访问.代理可以在不改动目标对象的基础上,增加其他额外 ...