2011-02-22 32 views
7

Me pregunto cómo pasaría por un datetime o cualquier tipo de variable para ir de 12:00 AM a 11:59 PM cada 30 minutos?C# loops a través de 24 horas cada 30 minutos

Entonces, ¿necesito una variable que muestre las horas en formato 12HR (01:00 PM, 09:00 AM) y cada vez que lo repique, para agregar 30 minutos a la vez? Entonces necesito usar este valor en una cadena.

El tiempo necesario para comenzar a las 10:00 AM

+0

Por qué bucle? Según su descripción, sería fácil determinar cuál debería ser la cuerda en cualquier momento del día. – Paddy

+0

@Paddy - Creo que el OP quiere recorrer todos los valores de 10:00 AM a 9:59 AM en incrementos de 30 minutos. Aunque, ciertamente, no estoy realmente seguro. La pregunta no es muy clara. –

Respuesta

14

y siempre hay 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 (para el arranque parametrizado)

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")); 

... o si solo quieres los desplazamientos 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

¿Hay alguna manera de decir a qué hora quiero comenzar en el foreach? – user380432

+0

Creo que debería ser 'Enumerable.Range (0, 47)' ya que el 0..48 le daría 49 veces, lo que se aplica al día siguiente con 24.5 horas. – gunwin

+0

Ese segundo valor es un conteo no un límite. –

2

DateTime puede hacer aritmética simple:

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

provoca que el tiempo se incrementará en un minuto.

Puede usar una clase Timer y aumentar DateTime por el tiempo que sea apropiado una vez por tick. Si la exactitud es importante aquí hay otras clases de temporizador más apropiadas.

¡Hay otros métodos estáticos en la clase TimeSpan también!

6

Se podría utilizar un método de extensión:

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

+1 para implementar como IEnumerable. ¿No es eso mientras (verdad) va a hacerlo enum para siempre? – Radu094

+1

sí, es una secuencia infinita: ciertamente no se puede hacer un '.ToList()' en este caso, pero se puede hacer 'dt.GetHalfHours(). Tomar (5)' es decir, obtener las siguientes 5 "medias horas" - todo funciona porque Linq es flojo – BrokenGlass

+0

Uso inteligente de linq :) – JonWillis

1

algo como esto?

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

Esto funcionó perfectamente para lo que estaba tratando de hacer, gracias. – bigcakes

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()); 
     } 

Esto podría hacer lo que tiene

0

Algo como esto debería funcionar para usted:

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()); 
} 
Cuestiones relacionadas