如何比较不同时区的时间

时间:2013-09-21 06:24:30

标签: c# .net

我有时区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,它将是系统日期时间。 所以我想比较字符串。这可能吗?还有其他替代方案吗?

1 个答案:

答案 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;
        }
    }
}