Воспроизведение аудиофайла, если время совпадает

#c#

#c#

Вопрос:

Почему я не могу воспроизвести этот аудиофайл, когда время textboxordertostart.Text в строковом формате равно системному времени? Textboxordertostart получает время после вычитания минут из DateTimePicker времени.

Мой код выглядит следующим образом.

 SoundPlayer myplayer = new SoundPlayer();

myplayer.SoundLocation= (@"c:userswoolsvalleydocumentsvisual studio 2015ProjectsWindowsFormsApplication17WindowsFormsApplication17Alarm.wav");


if (DateTime.Now.ToString("hh:mm tt") == textBox_ordertostart.Text)
{ 
    myplayer.Play(); 
}
  

Этот код выдает нулевое исключение

 string formatString = "yyyHHmmss";
        string sample = textBox_ordertostart.Text;
        DateTime dt = DateTime.ParseExact(sample, formatString, null);
        if (DateTime.Now == dt)
        { myplayer.Play(); }
  

это тоже не работает

 if (DateTime.Now == DateTime.Parse(textBox_ordertostart.Text))
        { myplayer.Play(); }
  

Комментарии:

1. Для чего это значение textBox_ordertostart.Text ? Вы прошли через код в отладчике, чтобы увидеть?

2. Я бы установил точку останова в условной строке и вручную проверил, что DateTime.Now.ToString("hh:mm tt") возвращается. Вы должны иметь возможность сравнить его со значением, которое вы ввели в текстовое поле, и легко понять, почему они не совпадают.

3. textBox_ordertostart.Text возвращает ли ваше значение, подобное этому 00:00 PM ?

4. Как я упоминал в своем ответе, это очень «жесткий» способ сравнения. Сначала вам нужно проанализировать содержимое текстового поля как дату и время, а затем их станет намного проще сравнивать.

5. Спасибо, ребята! В моей форме есть метка, которая принимает системное время как DateTime.Now.toString(«hh:mm tt») только для отображения системного времени. Поскольку и метка, и текстовое поле имеют строковый формат, я также сравнил их, но файл все равно не воспроизводится. Я попробую разобрать текст по дате и времени. Дайте вам знать, ребята…

Ответ №1:

То, как вы проводите сравнение, является очень «хрупким» способом сравнения, потому что оно зависит от того, вводит ли пользователь время в точном формате, в котором вы его ожидаете. Например, когда я тестировал это, я получил следующие результаты:

 string datetime = DateTime.Now.ToString("hh:mm tt");

// False
Console.WriteLine(datetime == "2:06 PM");

        // False
        Console.WriteLine(datetime == "2:06 P.M.");
        // False
        Console.WriteLine(datetime == "2:06");

        // False
        Console.WriteLine(datetime == "02:06 P.M.");

        // True
        Console.WriteLine(datetime == "02:06 PM");
  

Если вы проанализируете его в объект DateTime, а затем выполните toString , он будет менее хрупким. Посмотрите, например, этот метод расширения:

 public static bool DayMinuteEqual(this string otherDate)
    {
        // We have to strip out the "." character if present (e.g. 2:05 P.M.)
        DateTime otherDateObj = DateTime.Parse(otherDate.Replace(".", ""));

        return DateTime.Now.ToString("hh:mm tt") == otherDateObj.ToString("hh:mm tt");
    }
  

Теперь я получаю ожидаемые результаты:

 // True
        Console.WriteLine("2:20 PM".DayMinuteEqual());

        // True
        Console.WriteLine("2:20 P.M.".DayMinuteEqual());

        // False, but we'd expect it due to the omission of the "P.M."
        Console.WriteLine("2:20".DayMinuteEqual());

        // True
        Console.WriteLine("02:20 P.M.".DayMinuteEqual());

        // True
        Console.WriteLine("02:20 PM".DayMinuteEqual());
  

Очевидно, что это гораздо меньше зависит от пользователя, вводящего дату в «идеальном» формате (но все же требует, чтобы они имели некоторое представление о правильном формате).

Ответ №2:

спасибо, ребята. Этот код работает, мне просто нужно было вызвать его в событии обновления.

 private void timer1_Tick(object sender, EventArgs e)
    {   label_time1.Text = DateTime.Now.ToString("hh:mm tt");
        mplayer = new SoundPlayer();
        mplayer.SoundLocation = (@"c:userswoolsvalleydocumentsvisual studio 2015ProjectsWindowsFormsApplication17WindowsFormsApplication17Alarm.wav");
        if((DateTime.Now.ToString("HH:mm tt") == ((textBox_ordertostart.Text))))
        { mplayer.Play(); }