C# 判断时间点是否位于指定时间区间的方法

凌晨两点半
凌晨两点半
发布时间:2026-10-13 | 4人浏览过
原创

在C#开发中,有时需要根据特定的时间配置来限制程序运行或验证输入数据。本文将展示一种基于字符串解析的方案,通过将日期时间格式化为6位整数数值,快速判断当前时间点是否处于预设的开放区间内。

需求与格式定义

假设我们需要验证一个 DateTime 类型的时间点是否在合法的时间区间内。为了便于配置和存储,时间区间通常以字符串形式表示,其规则如下:

  • 单点格式:使用六位数字表示,即 HHMMSS(时-分-秒)。例如 12:34:56 记为 123456。
  • 区间结构:两个时间点由连字符 - 连接,构成一个区间 StartTime-EndTime。
  • 多区间组合:不同的区间之间使用分号 ; 隔开。

示例字符串:"000000-002559;030000-032559;060000-062559;151500-152059"。 这意味着如果时间在 00:00:00 到 00:25:59、03:00:00 到 03:25:59 等区间内,则视为合法。

核心实现逻辑

实现思路是将 DateTime 拆解为整数进行数学比较。由于一天只有 86400 秒,直接对比 HHMMSS 格式的整数可以简化跨天区的复杂判断(假设不涉及跨日期的区间计算)。

第1步:时间转整型

获取当前时间的时、分、秒,并按权重合并为一个整数:

int time_now = dt.Hour * 10000 + dt.Minute * 100 + dt.Second;

例如,16:21:31 转为 162131。

第2步:分割与遍历区间

利用分号 ; 拆分整个配置字符串,得到各个子区间。对每个子区间进行空值检查后继续处理:

string[] time_interval = time_intervals.Split(';');
foreach (string time in time_interval)
{
    if (string.IsNullOrWhiteSpace(time)) continue;
}

第3步:格式校验与数值提取

使用正则表达式 ^[0-9]{6}-[0-9]{6}$ 确保单个区间符合 "6位数字-6位数字" 的结构。若不符合,可在控制台输出错误提示(实际生产中建议抛出异常或记录日志)。

提取开始时间和结束时间的字符串部分,并尝试转换为整数 time_a 和 time_b:

string timea = time.Substring(0, 6);
string timeb = time.Substring(7, 6);
// ... int.TryParse 转换过程 ...

第4步:区间比对

核心判断条件:只要 time_now 大于等于起始值且小于等于结束值,即返回 true:

if (time_a <= time_now && time_now <= time_b)
{
    return true;
}

若遍历完所有区间均未命中,则默认返回 false。

完整代码示例

以下是包含命名空间引用、正则校验及主函数调用的完整 C# 代码:

using System;
using System.Text.RegularExpressions;

namespace TimeInterval
{
    class Program
    {
        static void Main(string[] args)
        {
            // 测试用例:根据运行时的实际时间打印结果
            // 示例配置定义了四个具体的分钟段
            string config = "000000-002559;030000-032559;060000-062559;151500-152059";
            
            bool result = isLegalTime(DateTime.Now, config);
            Console.WriteLine(result);
            Console.ReadLine();
        }

        /// <summary>
        /// 判断一个时间是否位于指定的时间段内
        /// </summary>
        /// <param name="dt">待检测的DateTime对象</param>
        /// <param name="time_intervals">时间区间字符串配置</param>
        /// <returns>bool</returns>
        static bool isLegalTime(DateTime dt, string time_intervals)
        {
            // 1. 将当前时间转换为HHMMSS格式的整数
            int time_now = dt.Hour * 10000 + dt.Minute * 100 + dt.Second;

            // 2. 按分号拆分区间
            string[] time_interval = time_intervals.Split(';');
            
            foreach (string time in time_interval)
            {
                // 跳过无效空白项
                if (string.IsNullOrWhiteSpace(time))
                {
                    continue;
                }

                // 3. 校验格式:必须是 xxxxxx-xxxxxx
                if (!Regex.IsMatch(time, "^[0-9]{6}-[0-9]{6}$"))
                {
                    Console.WriteLine($"{time}: 错误的时间数据格式");
                    continue;
                }

                // 4. 提取起止时间字符串
                string timea = time.Substring(0, 6);
                string timeb = time.Substring(7, 6);

                int time_a, time_b;

                // 5. 安全转换为整数
                if (!int.TryParse(timea, out time_a) || !int.TryParse(timeb, out time_b))
                {
                    Console.WriteLine($"转换失败: {timea} 或 {timeb}");
                    continue;
                }

                // 6. 范围比对
                if (time_a <= time_now && time_now <= time_b)
                {
                    return true;
                }
            }

            // 不在任何一个有效区间内
            return false;
        }
    }
}

注意事项与排错

在使用此方案时,请注意以下几点以确保准确性:

  • 边界包含:上述代码使用 <= 运算符,意味着区间的起始秒和结束秒均被视为合法时间(包含边界)。
  • 跨天问题:该方法基于单日内的小时/分/秒数值比对,无法直接处理跨越午夜(如 23:00:00 到 01:00:00)的时间区间。若需支持跨天,需将时间转化为绝对秒数或使用 DateTime 比较逻辑。
  • 输入容错:示例中包含基本的 TryParse 和 Regex 检查,但在生产环境中,建议对非法的配置抛出具体异常而非仅打印警告,以便及时发现配置错误。

以上就是C#实现判断一个时间点是否位于给定时间区间的详细内容,更多关于C#时间处理的技巧请持续关注本站相关技术文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表