网站首页
网站导航
Ctrl+D收藏
首 页
代码段
源码包
文档库
工具箱
代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C#
】
实现工作日和休息日(包括法定节假日)的计算
作者:
/ 发布于
2018/5/24
/
1736
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Common { public class HolidayHelper { #region 字段属性 private static object _syncObj = new object(); private static HolidayHelper _instance { get; set; } private static List<DateModel> cacheDateList { get; set; } private HolidayHelper() { } /// <summary> /// 获得单例对象,使用懒汉式(双重锁定) /// </summary> /// <returns></returns> public static HolidayHelper GetInstance() { if (_instance == null) { lock (_syncObj) { if (_instance == null) { _instance = new HolidayHelper(); } } } return _instance; } #endregion #region 私有方法 /// <summary> /// 读取文件 /// </summary> /// <param name="filePath"></param> /// <returns></returns> private static string GetFileContent(string filePath) { string result = ""; if (File.Exists(filePath)) { result = File.ReadAllText(filePath); } return result; } /// <summary> /// 获取配置的Json文件 /// </summary> /// <returns>经过反序列化之后的对象集合</returns> private static List<DateModel> GetConfigList() { string path = string.Format("{0}/xmlconfig/holidayConfig.json", System.AppDomain.CurrentDomain.BaseDirectory); string fileContent = GetFileContent(path); if (!string.IsNullOrWhiteSpace(fileContent)) { cacheDateList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DateModel>>(fileContent); } return cacheDateList; } /// <summary> /// 获取指定年份的数据 /// </summary> /// <param name="year"></param> /// <returns></returns> private static DateModel GetConfigDataByYear(int year) { if (cacheDateList == null)//取配置数据 GetConfigList(); DateModel result = cacheDateList.FirstOrDefault(m => m.Year == year); return result; } /// <summary> /// 判断是否为工作日 /// </summary> /// <param name="currDate">要判断的时间</param> /// <param name="thisYearData">当前的数据</param> /// <returns></returns> private static bool IsWorkDay(DateTime currDate, DateModel thisYearData) { if (currDate.Year != thisYearData.Year)//跨年重新读取数据 { thisYearData = GetConfigDataByYear(currDate.Year); } if (thisYearData.Year > 0) { string date = currDate.ToString("MMdd"); int week = (int)currDate.DayOfWeek; if (thisYearData.Work.IndexOf(date) >= 0) { return true; } if (thisYearData.Holiday.IndexOf(date) >= 0) { return false; } if (week != 0 && week != 6) { return true; } } return false; } #endregion #region 公共方法 public void CleraCacheData() { if (cacheDateList != null) { cacheDateList.Clear(); } } /// <summary> /// 根据传入的工作日天数,获得计算后的日期,可传负数 /// </summary> /// <param name="day">天数</param> /// <param name="isContainToday">当天是否算工作日(默认:true)</param> /// <returns></returns> public static DateTime GetReckonDate(int day, bool isContainToday = true) { DateTime currDate = DateTime.Now; int addDay = day >= 0 ? 1 : -1; if (isContainToday) currDate = currDate.AddDays(-addDay); DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { int sumDay = Math.Abs(day); int workDayNum = 0; while (workDayNum < sumDay) { currDate = currDate.AddDays(addDay); if (IsWorkDay(currDate, thisYearData)) workDayNum++; } } return currDate; } /// <summary> /// 根据传入的天数,获得计算后的日期(该日期不能是节假日) /// </summary> /// <param name="day"></param> /// <param name="isContainToday"></param> /// <returns></returns> public static DateTime GetReckonDateDay(int day, bool isContainToday = false) { DateTime currDate = DateTime.Now; int addDay = day >= 0 ? 1 : -1; if (isContainToday) currDate = currDate.AddDays(-addDay); DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { int sumDay = Math.Abs(day); int workDayNum = 0; while (workDayNum < sumDay) { currDate = currDate.AddDays(addDay); if (IsWorkDay(currDate, thisYearData)) workDayNum++; } } DateTime endDate = currDate; endDate = CheckIsHoliday(currDate, endDate); return endDate; } /// <summary> /// 根据传入的天数,获得计算后的日期(该日期不能是节假日) /// </summary> /// <param name="day">日数</param> /// <param name="currDate">初始化当前日期</param> /// <param name="isContainToday"></param> /// <returns></returns> public static DateTime GetReckonDateDay(int day,DateTime currDate,bool isContainToday = false) { int addDay = day >= 0 ? 1 : -1; if (isContainToday) currDate = currDate.AddDays(-addDay); DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { int sumDay = Math.Abs(day); int workDayNum = 0; while (workDayNum < sumDay) { currDate = currDate.AddDays(addDay); if (IsWorkDay(currDate, thisYearData)) workDayNum++; } } DateTime endDate = currDate; endDate = CheckIsHoliday(currDate, endDate); return endDate; } /// <summary> /// 根据传入的月数,获得计算后的日期(该日期不能是节假日) /// </summary> /// <param name="month"></param> /// <param name="isContainToday"></param> /// <returns></returns> public static DateTime GetReckonDateMonth(int month, bool isContainToday = false) { DateTime currDate = DateTime.Now; DateTime endDate = currDate.AddMonths(month); endDate = CheckIsHoliday(currDate, endDate); return endDate; } /// <summary> /// 根据传入的月数,获得计算后的日期(该日期不能是节假日) /// </summary> /// <param name="month">月数</param> /// <param name="currDate">初始化当前日期</param> /// <param name="isContainToday"></param> /// <returns></returns> public static DateTime GetReckonDateMonth(int month,DateTime currDate,bool isContainToday = false) { DateTime endDate = currDate.AddMonths(month); endDate = CheckIsHoliday(currDate, endDate); return endDate; } /// <summary> /// 判断是否节假日 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static DateTime CheckIsHoliday(DateTime currDate, DateTime dt) { DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { if (IsWorkDay(dt, thisYearData) == false) { dt = CheckIsHoliday(currDate, dt.AddDays(1)); } } return dt; } /// <summary> /// 根据传入的时间,计算工作日天数 /// </summary> /// <param name="date">带计算的时间</param> /// <param name="isContainToday">当天是否算工作日(默认:true)</param> /// <returns></returns> public static int GetWorkDayNum(DateTime date, bool isContainToday = true) { var currDate = DateTime.Now; int workDayNum = 0; int addDay = date.Date > currDate.Date ? 1 : -1; if (isContainToday) { currDate = currDate.AddDays(-addDay); } DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { bool isEnd = false; do { currDate = currDate.AddDays(addDay); if (IsWorkDay(currDate, thisYearData)) workDayNum += addDay; isEnd = addDay > 0 ? (date.Date > currDate.Date) : (date.Date < currDate.Date); } while (isEnd); } return workDayNum; } /// <summary> /// 根据传入的时间,计算工作日天数 /// </summary> /// <param name="date">带计算的时间</param> /// <param name="isContainToday">当天是否算工作日(默认:true)</param> /// <returns></returns> public static int GetWorkDayNum(DateTime currDate, DateTime date, bool isContainToday = true) { int workDayNum = 0; int addDay = date.Date > currDate.Date ? 1 : -1; if (isContainToday) { currDate = currDate.AddDays(-addDay); } DateModel thisYearData = GetConfigDataByYear(currDate.Year); if (thisYearData.Year > 0) { bool isEnd = false; do { currDate = currDate.AddDays(addDay); if (IsWorkDay(currDate, thisYearData)) workDayNum += addDay; isEnd = addDay > 0 ? (date.Date > currDate.Date) : (date.Date < currDate.Date); } while (isEnd); } return workDayNum; } #endregion public struct DateModel { public int Year { get; set; } public List<string> Work { get; set; } public List<string> Holiday { get; set; } } } }
评论列表
本站所提供的代码,版权归原作者所有,若有侵犯作者版权,请与我们联系,我们将立即删除或修改。谢谢!
本站所有代码发布及提供者。
试试其它关键字
同语言下
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
.
实现对图片上传的接收
.
去除字符串中的空格,回车,换行符转变成‘;’在按‘
.
按照回车换行符分割字符串
.
文件MD5码 比较,检测文件是否一样
.
计算每周和每月固定日期
可能有用的
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
.
实现对图片上传的接收
.
去除字符串中的空格,回车,换行符转变成‘;’在按‘
.
按照回车换行符分割字符串
.
文件MD5码 比较,检测文件是否一样
.
计算每周和每月固定日期
贡献的其它代码
Label
地图
本站
我们
服务
版权
联系
回馈
博客