0

我有一个时区 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";

假设当我运行程序时,如果美国的当前时间介于此时间(开始时间和结束时间)之间,那么我必须执行操作,否则不会

我在一个字符串中有美国的当前时间,字符串 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 之间。

注意:如果我使用转换为 dateTime,它将是系统日期时间。所以我想比较字符串。这可能吗?还有其他选择吗?

4

1 回答 1

0

如果我理解正确,您需要将开始时间和结束时间解析为 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;
        }
    }
}
于 2013-09-21T07:29:30.610 回答