2013-09-21 30 views
0

我有一個時區標識=東部標準時間。 我在美國的具體時間(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它將系統日期時間。 所以我想比較字符串。這可能嗎?有沒有其他的選擇呢?

+1

我不明白你爲什麼不能和日期時間比較? –

回答

0

如果我理解正確,則需要將開始時間和結束時間解析爲EST時間,然後將當前本地時間與EST時間進行比較。示例控制檯應用程序在下面執行。它做了一個包容性的比較(時間是> =開始和時間是< =結束),但如果你想獨家你可以輕鬆地改變它自己。此外,輸入被解析爲軍事時間,所以如果您想要支持本地化的12小時格式,則需要更改該輸入。

它的肉是TryParseTimeAsEst方法,該方法解析輸入,計算相對於EST的當前偏移量(包括當前的DST設置),並在正確的目標偏移量中構造一個DateTimeOffset

請注意,當您檢索TimeZoneInfo時,.NET將不會自動反映當前的DST。偏移量將始終爲默認偏移量(EST爲-5:00,而不管當前的DST爲-4:00)。爲了解決這個問題,你需要獲得當前時間爲UTC,並使用GetUtcOffset方法來獲得實際的偏移w/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; 
     } 
    } 
}