2011-02-22 194 views
7

24小時循環我不知道我怎麼會遍歷datetime或任何類型的變量,從上午12:00到晚上11:59每30分鐘?C#通過每30分鐘

所以我需要一個變量,顯示次12HR格式(下午1點00,09:00 AM),並通過它每次我循環,以30分鐘添加到時間?然後我需要在一個字符串中使用這個值。

的時間需要啓動日上午10:00

+0

爲什麼循環?從你的描述中,很容易確定一天中的任何時候弦應該是什麼? – Paddy 2011-02-22 21:46:14

+0

@Paddy - 我認爲OP希望的遍歷從10:00 AM每個值 - 上午09點59半小時遞增。雖然,不可否認,我並不確定。這個問題不是很清楚。 – 2011-02-22 21:49:37

回答

14

而且總是有LINQ

var start = DateTime.Today; 
var clockQuery = from offset in Enumerable.Range(0, 48) 
       select start.AddMinutes(30 * offset); 
foreach (var time in clockQuery) 
    Console.WriteLine(time.ToString("hh:mm tt")); 

... LINQ + FUNC(參數化開始)

Func<DateTime, IEnumerable<DateTime>> clockQuery = start => 
    from offset in Enumerable.Range(0, 48) 
    select start.AddMinutes(30 * offset); 
foreach (var time in clockQuery(DateTime.Today)) 
    Console.WriteLine(time.ToString("hh:mm tt")); 

...或者如果您只想要TimeSpan偏移...

var start = DateTime.Today; 
var clockQuery = from offset in Enumerable.Range(0, 48) 
       select TimeSpan.FromMinutes(30 * offset); 
foreach (var time in clockQuery) 
    Console.WriteLine((start + time).ToString("hh:mm tt")); 
+0

有沒有辦法說,我想在foreach開始與什麼時候? – user380432 2011-02-22 22:32:10

+0

我認爲它應該是'Enumerable.Range(0,47)',因爲0..48會給你49次,其中24.5小時運行到第二天。 – gunwin 2014-02-05 00:20:16

+0

第二個值是一個不受限制的計數。 – 2016-10-26 14:54:26

2

日期時間可以做簡單的算術題:

DateTime time = DateTime.Now; 
time = time + TimeSpan.FromMinutes(1); 

導致以一分鐘遞增一次。

您可以使用Timer類,並根據tick每增加一個適當的時間量來增加日期時間。如果正確性很重要,那麼還有其他更合適的計時器類。

上有TimeSpan類的其他靜態方法以及!

6

你可以使用一個擴展方法:

public static class DateTimeHelper 
{ 
    public static IEnumerable<DateTime> GetHalfHours(this DateTime dt) 
    { 
     TimeSpan ts = TimeSpan.FromMinutes(30); 
     DateTime time = dt; 
     while(true) 
     { 
      yield return time; 
      time.Add(ts); 
     } 
    } 
} 
+1

用於實現IEnumerable。雖然(真的)會永遠讓它枚舉嗎? – Radu094 2011-02-22 21:52:45

+1

是的,這是一個無限序列 - 當然不能在這個上執行'.ToList()',但是你可以執行'dt.GetHalfHours()。拿(5)'即得到接下來的5個半小時 - 所有的作品,因爲LINQ的懶惰 – BrokenGlass 2011-02-22 21:54:55

+0

巧妙利用LINQ :) – JonWillis 2011-02-22 21:58:59

1

這樣的事情?

DateTime timeloop = new DateTime(0); 
timeloop = timeloop.Add(new TimeSpan(10, 00, 0)); //start at 10:00 AM 

      for (int i = 0; i < 48; i++) 
      { 
       string time =timeloop.ToString("hh:mm tt");   //print it as 1:30 PM 
       timeloop = timeloop.Add(new TimeSpan(0, 30, 0));  //add 30 minutes 
           } 
+0

的這完美地工作爲了什麼,我試圖做的,謝謝。 – bigcakes 2013-05-06 19:04:55

0
 DateTime time = new DateTime(2011,02,22,10,0,0); 
     List<String> times = new List<string>(); 

     for (int i = 0; i < 48; i++) 
     { 
      time = time.AddMinutes(30); 
      times.Add(time.ToString()); 
     } 

這可能會做什麼,你需要

0

像這樣的東西應該爲你工作:

int workCount = 0; 
    var timer = new System.Timers.Timer(1800000); // every half hour 
    timer.AutoReset = true; 

    timer.Elapsed += (src, e) => 
    { 
     Console.WriteLine(DateTime.Now.ToString("HH:mm:ss")); 

     if(++workCount == 48) 
     { 
      timer.Stop(); 
     } 
    }; 

    timer.Start(); 
1
var times = new List<string>(); 
DateTime today = DateTime.Today; 
DateTime tomorrow = today.AddDays(1); 
for (var i = today; i < tomorrow; i = i.AddMinutes(30)) 
{ 
    times.Add(i.ToShortTimeString()); 
}