大家来分析,求请假时间的分钟数问题!

里沃特 2010-10-15 06:00:39
假设请假时间从 t1 到 t2,上班时间可能出现的情况:

两次打卡: time1(上班), time2(下班);
四次打卡:time1(上班), time2(下班), time3(上班), , time4(下班);
....(更多次打卡情况)(肯定是偶数次,因为上班下班成对出现)

求实际的请假时间总分钟数,因为请假时间不固定,有可能请假时间不在上班时间内,那样的话请假时间为0,也有可能刚好是上班时间总数((time2-time1)(两次)或(time2-time1)+(time4-time3)(四次)),还有更多可能的情况。

请利用 DateTime,TimeSpan 来计算。上面的 time1...time4,t1,t2都是DateTime类型
...全文
225 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
里沃特 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jshi123 的回复:]
.net 2.0版

C# code

static void Main(string[] args)
{
string[] times = new string[] { "9:05", "12:35", "13:15", "16:30" };
string worktime = "9:00-12:00 13:00-17:00";

if (times.L……
[/Quote]

非常感谢你,我自己也根据你的第一个改成2.0已经成功了。
我再测试下你这个,看看效率。
jshi123 2010-10-18
  • 打赏
  • 举报
回复
.net 2.0版

static void Main(string[] args)
{
string[] times = new string[] { "9:05", "12:35", "13:15", "16:30" };
string worktime = "9:00-12:00 13:00-17:00";

if (times.Length % 2 != 0)
throw new Exception("时间必须成对");

List<DateTime> ts = new List<DateTime>();
Array.ForEach(times, delegate(string s) { ts.Add(DateTime.Parse(s)); });

List<DateTime> wt = new List<DateTime>();
Array.ForEach(worktime.Split(' ', '-'), delegate(string s) { wt.Add(DateTime.Parse(s)); });

ts.Add(DateTime.Now.Date.AddDays(1));
wt.ForEach(delegate(DateTime t)
{
ts.InsertRange(ts.FindIndex(delegate(DateTime t1) { return t1 >= t; }), new DateTime[] { t, t });
});

int i = 0;
int am1 = ts.FindIndex(delegate(DateTime t) { return i++ % 2 == 1 && t >= wt[0]; });
int am2 = ts.FindLastIndex(delegate(DateTime t) { return t <= wt[1]; });
i = 0;
int pm1 = ts.FindIndex(delegate(DateTime t) { return i++ % 2 == 1 && t >= wt[2]; });
int pm2 = ts.FindLastIndex(delegate(DateTime t) { return t <= wt[3]; });

long ticks = 0;
i = 0;
ts.GetRange(am1, am2 - am1).ForEach(delegate(DateTime t) { ticks += i % 2 == 1 ? (t - ts[am1 + i - 1]).Ticks : 0; i++; });
i = 0;
ts.GetRange(pm1, pm2 - pm1).ForEach(delegate(DateTime t) { ticks += i % 2 == 1 ? (t-ts[pm1 + i - 1]).Ticks : 0; i++; });

TimeSpan r = new TimeSpan(ticks);
Console.WriteLine("共请假" + r.TotalMinutes + "分钟");
}
int64 2010-10-18
  • 打赏
  • 举报
回复
我做过考勤,不管比你这个简单多了,呵呵

你要设置早晨上班时间、中午休息时间、下午上班时间、下午下班时间,4个吧
然后利用打卡时间进行比对
里沃特 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mydear303 的回复:]
帮你顶顶,不沉贴
[/Quote]
谢谢。
里沃特 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jshi123 的回复:]
C# code

static void Main(string[] args)
{
var times = new string[] { "9:05", "12:35", "13:15", "16:30" };
string worktime = "9:00-12:00 13:00-17:00";

if (times.Length % 2 != 0)
……
[/Quote]

你太强了,这个 Linq 我还没怎么用。目前用的是 2.0,不过非常感谢,我可以先根据你这个思路改一改,看看结果。
要是有2.0的就好了。
mydear303 2010-10-18
  • 打赏
  • 举报
回复
帮你顶顶,不沉贴
lhongbao 2010-10-17
  • 打赏
  • 举报
回复
俺是新手
jshi123 2010-10-17
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
var times = new string[] { "9:05", "12:35", "13:15", "16:30" };
string worktime = "9:00-12:00 13:00-17:00";

if (times.Length % 2 != 0)
throw new Exception("时间必须成对");

var ts = times.Select(s => DateTime.Parse(s)).ToList();
var wt = worktime.Split(' ', '-').Select(s => DateTime.Parse(s)).ToList();

ts.Add(DateTime.Now.Date.AddDays(1));
wt.ForEach(t => ts.InsertRange(ts.FindIndex(t1 => t1 >= t), new DateTime[] { t, t }));

var t_am = ts.SkipWhile((t, i) => t < wt[0] || i % 2 == 0).TakeWhile(t => t <= wt[1]).ToList();
var t_pm = ts.SkipWhile((t, i) => t < wt[2] || i % 2 == 0).TakeWhile(t => t <= wt[3]).ToList();

var r = t_am.Select((t, i) => i % 2 == 1 ? (t - t_am[i - 1]).Ticks : 0).Sum() +
t_pm.Select((t, i) => i % 2 == 1 ? (t - t_pm[i - 1]).Ticks : 0).Sum();

Console.WriteLine("共请假" + new TimeSpan(r).TotalMinutes + "分钟");
}
里沃特 2010-10-16
  • 打赏
  • 举报
回复
没有人会吗?100分就这样沉了?
wuyq11 2010-10-15
  • 打赏
  • 举报
回复
OA系统的考勤统计这方面分析比较详细
请假工作流有开始时间结束时间,可能跨天等
不是简单的timespan就可解决的,看看通达OA
netstray 2010-10-15
  • 打赏
  • 举报
回复
…………………………
guyehanxinlei 2010-10-15
  • 打赏
  • 举报
回复
有人代打需要Handle吗?
里沃特 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gongsun 的回复:]
有那么麻烦吗,直接写请假条就可以了。

现在很多公司都弹性工作时间。
[/Quote]

无语,这是编程,大哥?
gongsun 2010-10-15
  • 打赏
  • 举报
回复
有那么麻烦吗,直接写请假条就可以了。

现在很多公司都弹性工作时间。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧