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

里沃特 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类型
...全文
226 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
  • 打赏
  • 举报
回复
有那么麻烦吗,直接写请假条就可以了。

现在很多公司都弹性工作时间。
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

111,129

社区成员

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

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

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