c# - tablas - ¿Cómo se repite todos los días del año?
optimizar consultas lentas mysql (8)
Dada una fecha de inicio de 01/01/2009 y una fecha de finalización de 31/12/2009, ¿cómo puedo repetir cada fecha y recuperar un valor de DateTime usando c #?
¡Gracias!
Establecer dos variables:
DateTime lowValue = DateTime.Parse("1/1/2009");
DateTime highValue = DateTime.Parse("12/31/2009");
Luego, agregue un día al valor bajo hasta que sea igual a highvalue:
while (lowValue <= highValue)
{
//Do stuff here
lowValue = lowValue.AddDays(1);
}
O algo así.
Yo usaría un bucle que se parece a esto
for(DateTime date = begin; date <= end; date = date.AddDays(1))
{
}
Establecer comenzar y terminar en consecuencia
Usaría MiscUtil y sus métodos de extensión:
foreach(DateTime date in 1.January(2009)
.To(31.December(2009))
.Step(1.Days())
{
Console.WriteLine(date);
}
int day; for (int i = 1; i<365;i++) { day++; }
Lo siento, no pude resistir.
DateTime current = DateTime.Parse("1/1/2009");
DateTime nextYear = current.AddYears(1);
do
{
Console.WriteLine(current);
current = current.AddDays(1);
} while (current < nextYear) ;
DateTime dateTime = new DateTime(2009, 1, 1);
while(dateTime.Year < 2010)
{
dateTime = dateTime.AddDays(1);
}
Un método alternativo que podría ser más reutilizable es escribir un método de extensión en DateTime y devolver un IEnumerable.
Por ejemplo, puedes definir una clase:
public static class MyExtensions
{
public static IEnumerable EachDay(this DateTime start, DateTime end)
{
// Remove time info from start date (we only care about day).
DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);
while (currentDay <= end)
{
yield return currentDay;
currentDay = currentDay.AddDays(1);
}
}
}
Ahora en el código de llamada puedes hacer lo siguiente:
DateTime start = DateTime.Now;
DateTime end = start.AddDays(20);
foreach (var day in start.EachDay(end))
{
...
}
Otra ventaja de este enfoque es que hace que sea trivial agregar EachWeek, EachMonth, etc. A continuación, todos estarán accesibles en DateTime.
Otra opción para implementar el patrón de diseño del iterador:
Esto puede parecer innecesario, pero dependiendo de cómo usar esta funcionalidad, también puede implementar el patrón de diseño del iterador .
Piense en esto. Supongamos que todo funciona bien, y copia / pega por todas partes la frase "para". Y, de repente, como parte de los requisitos, debe repetir todos los días, pero omita algunos de ellos (como en el calendario, saltarse las vacaciones, los fines de semana, personalizados, etc.)
Debería crear un nuevo "recorte" y usar el calendario en su lugar. Luego busca y reemplaza todos tus for''s.
En OOP, esto podría lograrse utilizando el patrón iterador.
De Wikpedia:
En la programación orientada a objetos, el patrón del iterador es un patrón de diseño en el que los iteradores se utilizan para acceder a los elementos de un objeto agregado secuencialmente sin exponer su representación subyacente . Un objeto Iterator encapsula la estructura interna de cómo se produce la iteración.
Entonces la idea es usar una construcción como esta:
DateTime fromDate = DateTime.Parse("1/1/2009");
DateTime toDate = DateTime.Parse("12/31/2009");
// Create an instance of the collection class
DateTimeEnumerator dateTimeRange =
new DateTimeEnumerator( fromDate, toDate );
// Iterate with foreach
foreach (DateTime day in dateTimeRange )
{
System.Console.Write(day + " ");
}
Y luego, si es necesario, puede crear subclases para implementar diferentes algoritmos, uno que use AddDay (1), otro que use AddDay (7) u otro que simplemente use Calendar. Etcétera etcétera.
La idea es reducir el acoplamiento entre los objetos.
De nuevo, esto sería excesivo para la mayoría de los casos, pero si la iteración forma una parte relevante de un sistema (digamos que está creando algún tipo de notificación para una empresa y debe adherirse a diferentes globalizaciones).
La implementación básica por supuesto usaría el for.
public class DateTimeEnumerator : System.Collections.IEnumerable
{
private DateTime begin;
private DateTime end;
public DateTimeEnumerator ( DateTime begin , DateTime end )
{
// probably create a defensive copy here...
this.begin = begin;
this.end = end;
}
public System.Collections.IEnumerator GetEnumerator()
{
for(DateTime date = begin; date < end; date = date.AddDays(1))
{
yield return date;
}
}
}
Solo una idea :)