Generar fechas aleatorias con C#

En los cursos suelo utilizar datos casi siempre aleatorios y, últimamente me ha dado por hacer los ficheros con C#. Hasta aquí, bien, pero me pasó una cosa curiosa ayer. El caso es que necesitaba crear un par de columnas con una serie de fechas aleatorias y, de buenas a primeras me quedé delante del ordenador, pensando. Me quedé en blanco porque, sencillamente, no se me ocurrían más que cosas en las que seguro que me tiraba un buen rato para una tontería como esta. Obtener un año aleatorio, calcular un mes, usar el método DateTime.DaysInMonth para que no se produzcan excepciones al obtener fechas del tipo 31/11/2011.

¿Por qué, de vez en cuando nos pasa que perdemos el norte y nos complicamos tanto la vida?. Cuando tenía la tira de líneas escritas me di cuenta que podría hacer una adición de días a una fecha inicial.

Por supuesto, dejo la clase resultante, no la que empecé a hacer…

   1: using System;
   2:  
   3: namespace JnSoftware.Helpers
   4: {
   5:  
   6:     /// <summary>
   7:     /// Utilidades de fechas
   8:     /// </summary>
   9:     class DateUtils
  10:     {
  11:         Random seed = new Random(DateTime.Now.Millisecond);
  12:  
  13:         // Evita la instancia de la clase.
  14:         private DateUtils() { }
  15:  
  16:  
  17:         private DateTime[] getDates(int numDates, DateTime dateInit, DateTime dateEnd)
  18:         {
  19:             DateTime[] lst = new DateTime[numDates];
  20:             for (int i = 0; i < numDates; i++)
  21:             {
  22:                 // Obtenemos el intervalo de tiempo
  23:                 TimeSpan interval = dateEnd.Subtract(dateInit);
  24:                 // Se calcula el número de días
  25:                 int randomMax = (int)interval.TotalDays;
  26:                 // Se obtiene un número aleatorio
  27:                 long randomValue = seed.Next(0, randomMax);
  28:                 // Se le añade a la fecha inicial
  29:                 lst[i] = dateInit.AddDays(randomValue);
  30:             }
  31:             return lst;
  32:         }
  33:  
  34:  
  35:  
  36:  
  37:         #region Métodos públicos estáticos
  38:         /// <summary>
  39:         /// Obtiene una matriz de Fechas obtenidas de forma pseudo-aleatoria.
  40:         /// </summary>
  41:         /// <param name="numDates">Nº de Fechas deseadas</param>
  42:         /// <returns></returns>
  43:         public static DateTime[] GetRandomDate(int numDates)
  44:         {
  45:             return GetRandomDate(numDates, DateTime.MinValue, DateTime.MaxValue);
  46:         }
  47:  
  48:  
  49:         /// <summary>
  50:         /// Obtiene una matriz de Fechas obtenidas de forma pseudo-aleatoria.
  51:         /// </summary>
  52:         /// <param name="numDates">Nº de Fechas deseadas</param>
  53:         /// <param name="yearInit">Año de inicio del intervalo</param>
  54:         /// <param name="yearEnd">Año de fin del intervalo</param>
  55:         /// <returns></returns>
  56:         public static DateTime[] GetRandomDate(int numDates, int yearInit, int yearEnd)
  57:         {
  58:             return GetRandomDate(numDates, new DateTime(yearInit, 1, 1), new DateTime(yearEnd, 12, 31));
  59:         }
  60:  
  61:  
  62:         /// <summary>
  63:         /// Obtiene una matriz de Fechas obtenidas de forma pseudo-aleatoria.
  64:         /// </summary>
  65:         /// <param name="numDates">Nº de Fechas deseadas</param>
  66:         /// <param name="dateInit">Fecha de inicio del intervalo</param>
  67:         /// <param name="dateEnd">Fecha de fin del intervalo</param>
  68:         /// <returns></returns>
  69:         public static DateTime[] GetRandomDate(int numDates, DateTime dateInit, DateTime dateEnd)
  70:         {
  71:             DateUtils du = new DateUtils();
  72:             return du.getDates(numDates, dateInit, dateEnd);
  73:         }
  74:  
  75:         #endregion
  76:     }
  77: }

2 thoughts on “Generar fechas aleatorias con C#

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *