我觉得这更像是数学问题。我公司的员工遍布全国各地。公司的某些部门采用“奇数”工资周期,而另一些部门则采用“偶数”工资周期。我将给定支付期的开始日期称为“支付期”。我需要做两件事:
1)确定给定日期所属的发薪期
//Something like this:
public static DateTime getPayPeriodStartDate(DateTime givenDate, string EvenOrOdd)
{ .. }
2)获取两个日期之间的付款期列表:
//Something like this:
public static List<DateTime> getPayPeriodsBetween(DateTime start, DateTime end, string EvenOrOdd)
{ .. }
我使用几个日期作为固定标准,以此作为任何未来发薪期日期的基础。偶数和奇数的固定标准日期如下:
- 偶数 - 01/04/09
- 奇数 - 01/11/09
每个工资期从一周的星期日开始,持续两周。例如,使用上述标准日期,第一个偶发工资期从 01/04/09 开始,到 01/17/09 结束。第一个奇数工资期从 01/11/09 开始,到 01/24/09 结束。正如您所看到的,存在一些重叠。我们有数千名员工,因此有必要将他们稍微分散一下。
我有一个基于周数的解决方案,但它很笨重,并且必须每年“修复”。我想知道你会如何处理这件事。
尚未完全优化或测试,但这就是我想出的:
const int DaysInPeriod = 14;
static IEnumerable<DateTime> GetPayPeriodsInRange(DateTime start, DateTime end, bool isOdd)
{
var epoch = isOdd ? new DateTime(2009, 11, 1) : new DateTime(2009, 4, 1);
var periodsTilStart = Math.Floor(((start - epoch).TotalDays) / DaysInPeriod);
var next = epoch.AddDays(periodsTilStart * DaysInPeriod);
if (next < start) next = next.AddDays(DaysInPeriod);
while (next <= end)
{
yield return next;
next = next.AddDays(DaysInPeriod);
}
yield break;
}
static DateTime GetPayPeriodStartDate(DateTime givenDate, bool isOdd)
{
var candidatePeriods = GetPayPeriodsInRange(givenDate.AddDays(-DaysInPeriod), givenDate.AddDays(DaysInPeriod), isOdd);
var period = from p in candidatePeriods where (p <= givenDate) && (givenDate < p.AddDays(DaysInPeriod)) select p;
return period.First();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)