You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动识别用户起止日期生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:20:42