我有时区ID =东部标准时间。 我必须在特定的美国时间(EST)进行一些操作
Example:
I want to do an operation between 11:00-11:30( as an input from user)
I stored this time in 2 string
string StartTime="11:00";
String EndTime="11:30";
假设当我运行程序时,如果美国当前时间介于此时间(StartTime和EndTime)之间,那么我必须执行其他操作
我在美国的当前时间是一个字符串,字符串UStime =“11:25”;
DateTime timeUtc = DateTime.UtcNow;
string strTimeZoneId_Newyork = "Eastern Standard Time";
TimeZoneInfo tZone_Newyork = TimeZoneInfo.FindSystemTimeZoneById(strTimeZoneId_Newyork);
DateTime dt_Time_Newyork = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, tZone_Newyork);
string strDayOfWeek_Newyork = dt_Time_Newyork.DayOfWeek.ToString();
string strTime_Newyork = dt_Time_Newyork.ToShortTimeString();
但我想知道比较11:25是否在11:00-11:30之间。
注意:如果我使用convert to dateTime,它将是系统日期时间。 所以我想比较字符串。这可能吗?还有其他替代方案吗?
答案 0 :(得分:0)
如果我理解正确,您需要将开始时间和结束时间解析为EST时间,然后将当前本地时间与那些EST时间进行比较。示例控制台应用程序执行以下操作。它进行了包容性比较(时间是> =开始和时间是< =结束),但如果你想要独家,你可以自己轻松地改变它。此外,输入被解析为军事时间,因此如果您希望支持本地化的12小时格式,则需要更改输入。
它的主要部分是TryParseTimeAsEst
方法,它解析输入,计算相对于EST的当前偏移量(包括当前的DST设置),并在正确的目标偏移量中构造DateTimeOffset
。
请注意,当您检索TimeZoneInfo
时,.NET不会自动反映当前的夏令时。偏移量始终是默认偏移量(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;
}
}
}