如何自动识别用户起止日期生成DayBlock并处理时分TimeSpan?
解决方案
问题2:TimeSpan包含小时与分钟的正确实现
你写的TimeSpan.FromHours(17:30)是无效语法,C#不支持这种直接写时分的参数格式。以下是几种正确的实现方式:
方法1:将分钟转换为小时的小数
把分钟换算成小时的小数部分,比如30分钟就是0.5小时,17:30对应17.5小时:
TimeSpan.FromHours(17.5) // 17小时30分钟 TimeSpan.FromHours(13.25) // 13小时15分钟(15/60=0.25)
方法2:使用TimeSpan构造函数
直接传入小时、分钟、秒参数,最直观:
new TimeSpan(17, 30, 0) // 17小时30分钟 new TimeSpan(13, 15, 0) // 13小时15分钟
方法3:解析时间字符串
用TimeSpan.Parse或TimeSpan.TryParse解析"HH:mm"格式的字符串:
TimeSpan.Parse("17:30") TimeSpan.Parse("13:15")
修正后的示例代码:
//startDate = 22 Nov 2022 05:30 PM //endDate = 25 Nov 2022 1:15 PM class DayBlock { public DayOfWeek DayOfWeek { get; set; } public TimeSpan Start { get; set; } public TimeSpan End { get; set; } } DayBlock[] blockWeekdays = { new DayBlock {DayOfWeek=DayOfWeek.Tuesday, Start=new TimeSpan(17,30,0), End=TimeSpan.FromHours(24)}, new DayBlock {DayOfWeek=DayOfWeek.Wednesday, Start=TimeSpan.FromHours(0), End=TimeSpan.FromHours(24)}, new DayBlock {DayOfWeek=DayOfWeek.Thursday, Start=TimeSpan.FromHours(0), End=TimeSpan.FromHours(24)}, new DayBlock {DayOfWeek=DayOfWeek.Friday, Start=TimeSpan.FromHours(0), End=new TimeSpan(13,15,0)}, };
问题1:根据起止日期自动生成DayBlock数组
不需要硬编码,通过遍历起止日期之间的每一天,自动生成对应的DayBlock对象即可。以下是实现方法:
using System; using System.Collections.Generic; class DayBlock { public DayOfWeek DayOfWeek { get; set; } public TimeSpan Start { get; set; } public TimeSpan End { get; set; } } public class DateProcessor { public static DayBlock[] GenerateDayBlocks(DateTime startDate, DateTime endDate) { List<DayBlock> dayBlocks = new List<DayBlock>(); DateTime currentDate = startDate.Date; while (currentDate <= endDate.Date) { DayBlock block = new DayBlock(); block.DayOfWeek = currentDate.DayOfWeek; if (currentDate == startDate.Date) { // 第一天:开始时间是startDate的具体时间,结束时间是当天24点 block.Start = startDate.TimeOfDay; block.End = TimeSpan.FromHours(24); } else if (currentDate == endDate.Date) { // 最后一天:开始时间是0点,结束时间是endDate的具体时间 block.Start = TimeSpan.Zero; block.End = endDate.TimeOfDay; } else { // 中间天数:全天0点到24点 block.Start = TimeSpan.Zero; block.End = TimeSpan.FromHours(24); } dayBlocks.Add(block); currentDate = currentDate.AddDays(1); } return dayBlocks.ToArray(); } } // 调用示例 DateTime start = new DateTime(2022, 11, 22, 17, 0, 0); DateTime end = new DateTime(2022, 11, 25, 12, 0, 0); DayBlock[] result = DateProcessor.GenerateDayBlocks(start, end);
这段代码会自动遍历从startDate到endDate的所有日期,根据当天是起始日、结束日还是中间日,分别设置对应的时间范围,最终生成完整的DayBlock数组。
内容的提问来源于stack exchange,提问作者Fatt Sky
相关产品推荐
相关产品推荐

