根据时间间隔验证时间
Validate time against time interval
我有三个规则:
- 一个。上午 9 点到下午 3 点之间的时段
- 乙。下午 3 点到晚上 7 点之间的时段
- C。晚上 7 点到早上 9 点之间的时段
目前我将它们表示为TimeSpan
s
public class Rule
{
public string Name {get; set;}
public TimeSpan From {get; set;}
}
List<Rule> rules = new List<Rule>()
{
new Rule() {From = new TimeSpan(9, 0, 0), Name = "A"},
new Rule() {From = new TimeSpan(15, 0, 0), Name = "B"},
new Rule() {From = new TimeSpan(19, 0, 0), Name = "C"}
};
我的问题是如何根据该规则验证时间输入,比如晚上 9 点 10 分?
它应该选择第三条规则。
您可以使用以下内容:
DateTime input = DateTime.Now;
TimeSpan span = input.TimeOfDay;
for (int i = 0; i < rules.Count - 1; i++) {
if (span >= rules[i].From && span < rules[i + 1].From) {
return rules[i];
}
}
return rules[rules.Count - 1];
像下面这样的东西可能会起作用:
var currentSpan = DateTime.Now - DateTime.Now.Date;
int ruleIndex = -1;
for (int i = 0; i < rules.Count - 1; i++)
{
if (currentSpan >= rules[i].From && currentSpan < rules[i + 1].From)
{
ruleIndex = i;
break;
}
}
if (ruleIndex == -1 && (currentSpan >= rules.Last().From || currentSpan < rules.First().From))
{
ruleIndex = rules.Count - 1;
}
var rule = rules[ruleIndex];
一天只有24小时。你能不能做一个带有枚举的映射数组来赋值:
public enum Category
{
A,
B,
C
}
然后是数组。因此,根据您上面的类别 00:00 - 09:00 将是 C.
Category[] values = new Category[24];
for(int i = 0;i<9;i++)
{
values[i] = Category.C;
}
因此您可以类似地分配每个小时。
现在给定一个小时(比如早上 6 点)作为输入,您可以使用开关:
switch(values[6]) // gets the appropriate category.
{
case Category.A:
// handle
break;
case Category.B:
// Handle
break;
case Category.C:
// handle
break;
default:
break;
}
通过向 Rule
对象添加结束时间稍作修改
public class Rule {
public string Name { get; set; }
public TimeSpan From { get; set; }
public TimeSpan To { get; set; }
}
此扩展方法用于检查提供的输入是否在规则的时间范围内。
public static class RuleExtension {
public static bool Contains(this Rule rule, TimeSpan input) {
var value = TimeSpan.Parse(input.ToString());
var start = rule.From;
var end = rule.To;
if (end < start) {
//loopback
end += TimeSpan.FromHours(24);
if (value < start)
value += TimeSpan.FromHours(24);
}
return start.CompareTo(value) <= 0 && value.CompareTo(end) < 0;
}
}
以下单元测试用于验证扩展方法并从集合中提取规则。 (注意:使用 FluentAssertions 断言结果。)
[TestClass]
public class MyTestClass {
[TestMethod]
public void _ValidateTime() {
var rules = new List<Rule>()
{
new Rule() {From = new TimeSpan(9, 0, 0), To = new TimeSpan(15, 0, 0), Name = "A"},
new Rule() {From = new TimeSpan(15, 0, 0), To = new TimeSpan(19, 0, 0), Name = "B"},
new Rule() {From = new TimeSpan(19, 0, 0), To= new TimeSpan(5, 0, 0), Name = "C"}
};
var input = TimeSpan.Parse("21:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "C");
input = TimeSpan.Parse("08:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.BeNull();
input = TimeSpan.Parse("18:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "B");
input = TimeSpan.Parse("10:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "A");
}
我有三个规则:
- 一个。上午 9 点到下午 3 点之间的时段
- 乙。下午 3 点到晚上 7 点之间的时段
- C。晚上 7 点到早上 9 点之间的时段
目前我将它们表示为TimeSpan
s
public class Rule
{
public string Name {get; set;}
public TimeSpan From {get; set;}
}
List<Rule> rules = new List<Rule>()
{
new Rule() {From = new TimeSpan(9, 0, 0), Name = "A"},
new Rule() {From = new TimeSpan(15, 0, 0), Name = "B"},
new Rule() {From = new TimeSpan(19, 0, 0), Name = "C"}
};
我的问题是如何根据该规则验证时间输入,比如晚上 9 点 10 分?
它应该选择第三条规则。
您可以使用以下内容:
DateTime input = DateTime.Now;
TimeSpan span = input.TimeOfDay;
for (int i = 0; i < rules.Count - 1; i++) {
if (span >= rules[i].From && span < rules[i + 1].From) {
return rules[i];
}
}
return rules[rules.Count - 1];
像下面这样的东西可能会起作用:
var currentSpan = DateTime.Now - DateTime.Now.Date;
int ruleIndex = -1;
for (int i = 0; i < rules.Count - 1; i++)
{
if (currentSpan >= rules[i].From && currentSpan < rules[i + 1].From)
{
ruleIndex = i;
break;
}
}
if (ruleIndex == -1 && (currentSpan >= rules.Last().From || currentSpan < rules.First().From))
{
ruleIndex = rules.Count - 1;
}
var rule = rules[ruleIndex];
一天只有24小时。你能不能做一个带有枚举的映射数组来赋值:
public enum Category
{
A,
B,
C
}
然后是数组。因此,根据您上面的类别 00:00 - 09:00 将是 C.
Category[] values = new Category[24];
for(int i = 0;i<9;i++)
{
values[i] = Category.C;
}
因此您可以类似地分配每个小时。
现在给定一个小时(比如早上 6 点)作为输入,您可以使用开关:
switch(values[6]) // gets the appropriate category.
{
case Category.A:
// handle
break;
case Category.B:
// Handle
break;
case Category.C:
// handle
break;
default:
break;
}
通过向 Rule
对象添加结束时间稍作修改
public class Rule {
public string Name { get; set; }
public TimeSpan From { get; set; }
public TimeSpan To { get; set; }
}
此扩展方法用于检查提供的输入是否在规则的时间范围内。
public static class RuleExtension {
public static bool Contains(this Rule rule, TimeSpan input) {
var value = TimeSpan.Parse(input.ToString());
var start = rule.From;
var end = rule.To;
if (end < start) {
//loopback
end += TimeSpan.FromHours(24);
if (value < start)
value += TimeSpan.FromHours(24);
}
return start.CompareTo(value) <= 0 && value.CompareTo(end) < 0;
}
}
以下单元测试用于验证扩展方法并从集合中提取规则。 (注意:使用 FluentAssertions 断言结果。)
[TestClass]
public class MyTestClass {
[TestMethod]
public void _ValidateTime() {
var rules = new List<Rule>()
{
new Rule() {From = new TimeSpan(9, 0, 0), To = new TimeSpan(15, 0, 0), Name = "A"},
new Rule() {From = new TimeSpan(15, 0, 0), To = new TimeSpan(19, 0, 0), Name = "B"},
new Rule() {From = new TimeSpan(19, 0, 0), To= new TimeSpan(5, 0, 0), Name = "C"}
};
var input = TimeSpan.Parse("21:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "C");
input = TimeSpan.Parse("08:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.BeNull();
input = TimeSpan.Parse("18:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "B");
input = TimeSpan.Parse("10:10");
rules.FirstOrDefault(r => r.Contains(input))
.Should()
.NotBeNull()
.And
.Match((Rule r) => r.Name == "A");
}