Генератор случайного времени для времени между временем NOW до 23,99 (конец текущего дня) - PullRequest
0 голосов
/ 03 апреля 2020

Я создал некоторый код и классы для получения случайных Часа и Минуты между текущим временем (СЕЙЧАС) и Концом Дня. Мой код работает, но иногда неправильное время.

Допустим, сейчас 23:30, и я запускаю код, получаю НЕПРАВИЛЬНЫЙ вывод, где вывод записи показан ниже ... Значения должны быть по порядку СЕЙЧАС (при исполнении) до конца текущего дня.

Кто-нибудь знает, что я делаю неправильно?

НЕПРАВИЛЬНО (час / минута) :

  • 0: 23 - 12:23 (следующий день)
  • 23: 15 - 23:15

ПРАВО (час / минута) :

  • 23: 15 - 23:15
  • 0: 23 - 12:23 (следующий день)
public class MyHourMinuteTestClass
{
   ArrayList projects  = new ArrayList();
   TimeSpan start = DateTime.Now.TimeOfDay;
   TimeSpan s = TimeSpan.FromHours(DateTime.Now.Hour);
   TimeSpan e = TimeSpan.FromHours(23.99);
   int maxMin = (int)((e - s).TotalMinutes);

   public MyHourMinuteTestClass()
   {
   }

   public void TestValues()
   {
       // create 2 sets of values and add a new SocialTimes instance containing the hour/minute to the array list
      for(int i = 0; i < 2; i++)
      {
          int minutes = randomGen.Next(maxMin);
          TimeSpan t = start.Add(TimeSpan.FromMinutes(minutes));
          int PostTimeHour = t.Hours;
          int PostTimeMinutes = t.Minutes;
          projects.Add(new SocialTimes(NowDateStr, PostTimeHour, PostTimeMinutes));
      }

      // then I sort the projects array list
      projects.Sort(new hoursMinutesComparer());
    }
}

public class SocialTimes
{
        string DateToPostStr = "";
        public int HourToPost = 0;
        public int MinuteToPost = 0;

        public SocialTimes(string DateToPostStr, int HourToPost, int MinuteToPost)
        {
            this.DateToPostStr = DateToPostStr;
            this.HourToPost = HourToPost;
            this.MinuteToPost = MinuteToPost;
        }

        public string getDateToPostStr()
        {
            return this.DateToPostStr;
        }

        public int getHourToPost()
       {
            return this.HourToPost;
        }

        public int getMinuteToPost()
        {
            return this.MinuteToPost;
        }

        public int getHourMinuteToPost()
        {
            int sum;

            sum = HourToPost * 60 + MinuteToPost;

            return sum;
        }
 }

public class hoursMinutesComparer : IComparer
{
     int IComparer.Compare(Object xx, Object yy)
     {
         SocialTimes x = (SocialTimes)xx;
         SocialTimes y = (SocialTimes)yy;

         return x.getHourMinuteToPost().CompareTo(y.getHourMinuteToPost());
      }
 }

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я думаю, что часть вашей проблемы заключается в следующем ...

TimeSpan s = TimeSpan.FromHours(DateTime.Now.Hour);

Это в основном округление вниз текущего времени до ближайшего часа. Если сейчас 23:30, то ...

// This is pseudocode
s = 23h
e = 24h
maxMin = e - s = 1h

Итак, вы позволяете randomGen.Next(maxMin) генерировать количество минут до полного часа , даже если это меньше часа до полуночи . Чтобы исправить это, я думаю, вам просто нужно получить общее время, представленное в часах ...

TimeSpan s = TimeSpan.FromHours(DateTime.Now.TimeOfDay.TotalHours);

Тогда у вас будет ...

// This is pseudocode
s = 23h30m
e = 24h
maxMin = e - s = 30m

Следовательно, randomGen.Next(maxMin) может привести к максимум , (чуть меньше) 30 минут, что приведет вас к полуночи.

Несколько других примечаний:

  • Я думаю, что использование 23.99 делает невозможным вычисление 23:59.
    TimeSpan s = TimeSpan.FromHours(DateTime.Now.TimeOfDay.TotalHours); //  23h30m
    TimeSpan e = TimeSpan.FromHours(23.99);                             // <24h
    //                 (e - s).TotalMinutes                             //    <30m
    int maxMin = (int)((e - s).TotalMinutes);                           //     29m
    int minutes = randomGen.Next(maxMin);                               //     28m (Max)
    TimeSpan t = start.Add(TimeSpan.FromMinutes(minutes));              //  23h58m
    
    e - s равно чуть меньше 30 минут до полуночи. (int) усекает это до 29 минут. Параметр Random.Next() является исключительной верхней границей, поэтому пропуск 29 означает, что наибольшее значение, которое он может вернуть, составляет всего 28.
  • Кажется как если бы SocialTimes упростило бы сохранение данных в виде TimeSpan или даже DateTime, а затем, при желании, открыло бы свойства Hour и Minute.
  • Обязательно посмотрите List<> generi c класса , которые на go вытеснили ArrayList.
0 голосов
/ 03 апреля 2020

Это какой-то многословный код. Давайте посмотрим, смогу ли я немного уменьшить его / дать блок кода, который вы можете использовать для вдохновения (потому что это похоже на домашнюю работу)

public class Project{
  public Guid ID { get; set;}
  public DateTime Created{ get; set; }
}

public static class ProjectFactory{
  private static Random _r = new Random();

  public static Project CreateProject(){

    DateTime midnightTomorrow = DateTime.Today.AddDays(1);
    int secTilDayEnd = (int)(midnightTomorrow - DateTime.Now).TotalSeconds; 

    return new Project(){
      ID = Guid.NewGuid(),
      Created = DateTime.Now.AddSeconds(_r.Next(secTilDayEnd))
    };
  }
}

//and to use it

List<Project> p = new List<Project>(1000);
for(int i = 0; i < 1000; i++)
  p.Add(ProjectFactory.CreateProject());

foreach(var x in p.OrderBy(proj => proj.Created))
  Console.WriteLine($"Project {x.Id} created {x.Created:HH:mm}");

Давайте сохраним случайное время в datetime; мы всегда можем вычеркнуть время, если хотим только этого, но сохранение даты полезно сохранить. Это также означает, что мы можем просто использовать сравнение даты и времени по умолчанию, встроенное в c# - он знает, как упорядочивать даты

Я создал класс, у которого есть единственное задание для производства проектов с созданной датой некоторого времени между тем временем и конец дня. Это делается путем определения количества секунд до конца дня и добавления случайного числа этих секунд к текущему времени

А затем фрагмент кода для создания тысячи проектов, упорядочить их по дате и распечатайте их, показывая только время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...