检查给定日期是否在年份的子集中(例如晚于 12 月 6 日)
Check if a given date is in a subset of the year (e.g. later than 6th of December)
如何确定给定的 DateTime
是否在一年中的某个子集中。例如,我想知道今天是否在 12 月 6 日和 1 月 2 日之间。该子集表示为日期范围,并且可能 "wrap around" 如给定的示例。
让我们假设 UTC,这样夏令时等就不是问题了。
是否有使用 .NET BCL 执行此操作的简洁方法?
要检查的日期和日期范围的"end points"应该是任意的。
DateTime
的比较运算符重载。为什么不使用类似的东西:
DateTime x = ...
if (x > new DateTime(2015, 12, 6)) {
// ... do whatever ...
}
并将脏细节留给实现者(即 BCL)。
您明确说明了日期,所以我认为时间不是问题,我们可以忽略夏令时的复杂性 et.al。在这种情况下,您可以对年份中的日期进行一个简单的数字表达式,并且对循环情况有一点逻辑。我并不是说它很漂亮,但它会让你到达那里。例如:
void Main()
{
var range = new DateRange(new DateTime(2015,12,6), new DateTime(2016,1,2));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 12, 28)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 1)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 3)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 11, 28)));
}
public class DateRange
{
public const int OneYearWrap = 1200;
public int BeginValue { get; private set; }
public int EndValue { get; private set; }
public DateRange(DateTime begin, DateTime end)
{
BeginValue = DateValue(begin);
EndValue = DateValue(end);
if (EndValue < BeginValue)
EndValue += OneYearWrap;
}
public bool IsDateInRange(DateTime date)
{
int dateValue = DateValue(date);
if (EndValue > OneYearWrap && dateValue < BeginValue)
dateValue += OneYearWrap;
return dateValue >= BeginValue && dateValue <= EndValue;
}
int DateValue(DateTime date)
{
return date.Month * 100 + date.Day;
}
}
如何确定给定的 DateTime
是否在一年中的某个子集中。例如,我想知道今天是否在 12 月 6 日和 1 月 2 日之间。该子集表示为日期范围,并且可能 "wrap around" 如给定的示例。
让我们假设 UTC,这样夏令时等就不是问题了。
是否有使用 .NET BCL 执行此操作的简洁方法?
要检查的日期和日期范围的"end points"应该是任意的。
DateTime
的比较运算符重载。为什么不使用类似的东西:
DateTime x = ...
if (x > new DateTime(2015, 12, 6)) {
// ... do whatever ...
}
并将脏细节留给实现者(即 BCL)。
您明确说明了日期,所以我认为时间不是问题,我们可以忽略夏令时的复杂性 et.al。在这种情况下,您可以对年份中的日期进行一个简单的数字表达式,并且对循环情况有一点逻辑。我并不是说它很漂亮,但它会让你到达那里。例如:
void Main()
{
var range = new DateRange(new DateTime(2015,12,6), new DateTime(2016,1,2));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 12, 28)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 1)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 3)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 11, 28)));
}
public class DateRange
{
public const int OneYearWrap = 1200;
public int BeginValue { get; private set; }
public int EndValue { get; private set; }
public DateRange(DateTime begin, DateTime end)
{
BeginValue = DateValue(begin);
EndValue = DateValue(end);
if (EndValue < BeginValue)
EndValue += OneYearWrap;
}
public bool IsDateInRange(DateTime date)
{
int dateValue = DateValue(date);
if (EndValue > OneYearWrap && dateValue < BeginValue)
dateValue += OneYearWrap;
return dateValue >= BeginValue && dateValue <= EndValue;
}
int DateValue(DateTime date)
{
return date.Month * 100 + date.Day;
}
}