如果我理解正确,您需要将开始时间和结束时间解析为 EST 时间,然后将当前本地时间与这些 EST 时间进行比较。示例控制台应用程序在下面执行此操作。它进行了包容性比较(时间是 >= 开始且时间是 <= 结束),但是如果您想要独占性,您可以自己轻松更改它。此外,输入被解析为军用时间,因此如果您想要支持本地化的 12 小时格式,您需要更改它。
它的核心是该TryParseTimeAsEst
方法,它解析输入,计算相对于 EST 的当前偏移量(包括当前 DST 设置),并DateTimeOffset
在正确的目标偏移量中构造 a。
请注意,当您检索 .NET 文件时,.NET 不会自动反映当前 DST TimeZoneInfo
。偏移量将始终是默认偏移量(EST 为 -5:00,无论当前 DST 是什么......目前为 -4:00)。为了解决这个问题,您需要获取当前时间为 UTC,并使用该GetUtcOffset
方法获取带 DST 的实际偏移量。
class Program
{
static void Main(string[] args)
{
DateTimeOffset startTime, endTime, current = DateTimeOffset.Now;
Console.WriteLine("Enter the Start Time (in Eastern Standard Time)");
var inputStartTime = Console.ReadLine();
Console.WriteLine("Enter the End Time (in Eastern Standard Time)");
var inputEndTime = Console.ReadLine();
if (!TryParseTimeAsEst(inputStartTime, out startTime))
{
Console.WriteLine("Start time is invalid");
return;
}
if (!TryParseTimeAsEst(inputEndTime, out endTime))
{
Console.WriteLine("End time is invalid");
return;
}
var currentUtc = current.UtcDateTime;
if (startTime.UtcDateTime <= ccurrentUtc && currentUtc <= endTime.UtcDateTime)
{
Console.WriteLine("{0} is between {1} and {2}", current, startTime, endTime);
}
else
{
Console.WriteLine("{0} is NOT between {1} and {2}", current, startTime, endTime);
}
}
static bool TryParseTimeAsEst(string value, out DateTimeOffset time)
{
var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var today = DateTime.Today;
var nowUtc = DateTime.UtcNow; // need this to generate the offset that respects DST
try
{
var t = TimeSpan.Parse(value); // parse the input into time
time = new DateTimeOffset(today.Year, today.Month, today.Day, t.Hours, t.Minutes, t.Seconds, est.GetUtcOffset(nowUtc)); // create a datetime with offset that reflects DST
return true;
}
catch
{
time = DateTimeOffset.MinValue;
return false;
}
}
}