2011-02-22 148 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()); 
}