例如我们在设置审批流程时,往往需要设置限制时限,例如2天内审核好等等,这时候会遇到休息日,需要把休息日去掉,当然有各种各样复杂的情况,我们先把问题想得简单一些,就按普通的休息一整天,全公司都统一休息的方式。
下面是程序的运行效果,主要是把12个月展示在上面,有时候费力一些,黑色部分是表示休息,本想用红色显示,但是微软默认是黑色的,没能搞定
实现代码可以参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
//--------------------------------------------------------------------
// All Rights Reserved ,Copyright (C) 2012 , Hairihan TECH, Ltd. .
//--------------------------------------------------------------------
using
System;
using
System.Collections.Generic;
using
System.Windows.Forms;
using
DotNet.Business;
using
DotNet.Utilities;
namespace
DotNet.WinForm
{
public
partial
class
FrmHolidays : BaseForm
{
public
FrmHolidays()
{
InitializeComponent();
}
private
void
GetYearList()
{
// 绑定最近几年就可以了
for
(
int
i = DateTime.Now.Year - 3; i < DateTime.Now.Year + 2; i++)
{
this
.cmbYear.Items.Add(i.ToString());
}
// 今年为默认选中
this
.cmbYear.SelectedIndex =
this
.cmbYear.Items.Count - 2;
}
private
void
FrmHolidays_Load(
object
sender, EventArgs e)
{
this
.GetYearList();
}
/// <summary>
/// 获取节假日
/// </summary>
/// <param name="holiday">当前点中了某个日期了</param>
private
void
GetYearDas(
string
holiday =
null
)
{
BaseHolidaysManager manager =
new
BaseHolidaysManager(
this
.UserInfo);
if
(!
string
.IsNullOrEmpty(holiday))
{
int
returnValue = manager.Delete(
new
KeyValuePair<
string
,
object
>(BaseHolidaysEntity.FieldHoliday, holiday));
if
(returnValue == 0)
{
manager.AddHoliday(holiday,
false
);
}
}
int
year =
int
.Parse(
this
.cmbYear.SelectedItem.ToString());
this
.mc.Enabled =
false
;
if
(
this
.mc.MinDate.Year <= year)
{
this
.mc.MaxDate =
new
DateTime(year, 12, 31);
this
.mc.MinDate =
new
DateTime(year, 1, 1);
}
else
{
this
.mc.MinDate =
new
DateTime(year, 1, 1);
this
.mc.MaxDate =
new
DateTime(year, 12, 31);
}
this
.mc.Enabled =
true
;
// 把这一年的变粗的都加上来,这个是后台处理程序,所以没考虑数据库性能的问题,每次都读取了一下,有需要时可以改进一下
string
where
= BaseHolidaysEntity.FieldHoliday +
" >= '"
+
this
.mc.MinDate.ToString(BaseSystemInfo.DateFormat) +
"'"
+
" AND "
+ BaseHolidaysEntity.FieldHoliday +
" <= '"
+
this
.mc.MaxDate.ToString(BaseSystemInfo.DateFormat) +
"'"
;
List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(
where
);
List<DateTime> boldedDates =
new
List<DateTime>();
foreach
(BaseHolidaysEntity entity
in
listEntity)
{
boldedDates.Add(DateTime.Parse(entity.Holiday));
}
this
.mc.BoldedDates = boldedDates.ToArray();
}
private
void
cmbYear_SelectedIndexChanged(
object
sender, EventArgs e)
{
// 从数据库里读取出来节假日的设置
GetYearDas();
}
private
void
btnInitializeYear_Click(
object
sender, EventArgs e)
{
BaseHolidaysManager manager =
new
BaseHolidaysManager(
this
.UserInfo);
// 这里把周日,知道的5.1. 10.1 等节日进行休息日设置
int
year =
int
.Parse(
this
.cmbYear.SelectedItem.ToString());
DateTime startDate =
new
DateTime(year, 1, 1);
while
(startDate.Year == year)
{
// 周六周日是默认休息日
if
(startDate.DayOfWeek == DayOfWeek.Saturday || startDate.DayOfWeek == DayOfWeek.Sunday)
{
manager.AddHoliday(startDate.ToString(BaseSystemInfo.DateFormat));
}
// 5.1 是休息日
// 10.1 是休息日
startDate = startDate.AddDays(1);
}
// 从数据库里读取出来节假日的设置
GetYearDas();
}
private
void
mc_DateSelected(
object
sender, DateRangeEventArgs e)
{
GetYearDas(
this
.mc.SelectionStart.ToString(BaseSystemInfo.DateFormat));
}
}
}
|
还有几个函数相关函数,可以参考一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd.
//-----------------------------------------------------------------
using
System;
using
System.Data;
using
System.Collections.Generic;
using
System.Linq;
namespace
DotNet.Business
{
using
DotNet.Utilities;
/// <summary>
/// BaseHolidaysManager
/// 节假日表
///
/// 修改记录
///
/// 2012.12.24 版本:1.0 JiRiGaLa 创建主键。
///
///
/// 版本:1.0
/// </summary>
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2012.12.24</date>
/// </author>
/// </summary>
public
partial
class
BaseHolidaysManager : BaseManager
//, IBaseRoleManager
{
/// <summary>
/// 计算截至日期为几号
/// </summary>
/// <param name="currentDay">当前日期</param>
/// <param name="days">几个工作日</param>
/// <returns>应该在几号完成 yyyy-MM-dd</returns>
public
static
string
CalculateDays(DateTime currentDate,
int
days)
{
// 计算有几个节假日
string
where
= BaseHolidaysEntity.FieldHoliday +
" >= '"
+ currentDate.ToString(BaseSystemInfo.DateFormat) +
"'"
;
BaseHolidaysManager manager =
new
DotNet.Business.BaseHolidaysManager();
List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(
where
);
DateTime endDay = currentDate;
bool
find =
false
;
for
(
int
i = 0; i < days; i++)
{
find =
false
;
// 若这个日期是节假日,需要继续加一天
find = listEntity.Count(entity => !
string
.IsNullOrEmpty(entity.Holiday) && entity.Holiday.Equals(endDay.ToString(BaseSystemInfo.DateFormat), StringComparison.OrdinalIgnoreCase)) > 0;
while
(find)
{
// 若这个日期是节假日,需要继续加一天
endDay = endDay.AddDays(1);
find = listEntity.Count(entity => !
string
.IsNullOrEmpty(entity.Holiday) && entity.Holiday.Equals(endDay.ToString(BaseSystemInfo.DateFormat), StringComparison.OrdinalIgnoreCase)) > 0;
}
}
// 计算
return
endDay.ToString(BaseSystemInfo.DateFormat);
}
/// <summary>
/// 计算截至日期为几号
/// </summary>
/// <param name="currentDay">当前日期 yyyy-MM-dd</param>
/// <param name="days">几个工作日</param>
/// <returns>应该在几号完成</returns>
public
static
string
CalculateDays(
string
currentDate,
int
days)
{
DateTime dateTime = DateTime.Parse(currentDate);
return
CalculateDays(dateTime, days);
}
/// <summary>
/// 前日期与指定一个日期之间的, 工作日天数对吧?
/// </summary>
/// <param name="currentDate">开始日期 yyyy-MM-dd</param>
/// <param name="endDate">结束日期 yyyy-MM-dd</param>
/// <returns>工作日天数</returns>
public
static
int
CalculateWorkDays(
string
currentDate,
string
endDate)
{
int
returnValue = 0;
// 计算这2个日期相差几天
DateTime dateTime1 = DateTime.Parse(currentDate);
DateTime dateTime2 = DateTime.Parse(endDate);
TimeSpan timeSpan =
new
TimeSpan(dateTime2.Ticks).Subtract(
new
TimeSpan(dateTime1.Ticks)).Duration();
returnValue = timeSpan.Days;
// 计算有几个节假日
string
where
= BaseHolidaysEntity.FieldHoliday +
" >= '"
+ currentDate +
"'"
+
" AND "
+ BaseHolidaysEntity.FieldHoliday +
" <= '"
+ endDate +
"'"
;
BaseHolidaysManager manager =
new
DotNet.Business.BaseHolidaysManager();
List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(
where
);
// 在数据库里找还有几个工作日
returnValue = returnValue - listEntity.Count;
return
returnValue;
}
}
}
|
本文转自 jirigala 51CTO博客,原文链接:http://blog.51cto.com/2347979/1188452,如需转载请自行联系原作者