_Q12_ Ответов: 2

Обратный отсчет с датой и временем


[Моя идея: когда я изменяю переменную, она будет управляться датой-временем, но не зависеть от даты-времени.]
Таким образом, в принципе, DateTime будет считаться так, как ему заблагорассудится, но моя переменная будет поддерживать любые изменения в любое время, и отсчет от изменения будет установлен. Вверх или вниз.
Мне удалось сделать этот код для CountUp.И работает отлично, именно так, как я хотел, и Вы тоже можете попробовать, почувствовать это.
Теперь я изо всех сил пытаюсь сделать обратный отсчет...и у меня есть только некоторые идеи, но не полный путь, как это сделать в моем уме. Может быть, вы знаете решение. Я сделаю это в конце концов, но с вашей помощью, может быть, будет быстрее и лучше.

Что я уже пробовал:

public _Time()
{
}
public void Reset()
{
    StartTime = DateTime.Now;
    diference = new TimeSpan(h, m, s);
    int xa = 60;
    EndTime = new DateTime(9999, 01, 01, h * xa, m * xa, s * xa);
}

/// <summary>
/// set or get this value
/// </summary>
public int h;
/// <summary>
/// set or get this value
/// </summary>
public int m;
/// <summary>
/// set or get this value
/// </summary>
public int s;
DateTime StartTime;
TimeSpan diference;
TimeSpan elapsed;
public void CountUp()
{
    elapsed = DateTime.Now - StartTime + diference;
    //now update the values
    h = elapsed.Hours;
    m = elapsed.Minutes;
    s = elapsed.Seconds;
}

//TimeSpan unu = new TimeSpan(0, 0, 1);
//int inch = 0;
//int incm = 0;
//int incs = 0;
DateTime EndTime;
public void CountDown()
{
    //10s/10s = 0
    //
    //
    //
    elapsed = EndTime.Subtract(DateTime.Now);
    //now update the values
    h = elapsed.Hours;
    m = elapsed.Minutes;
    s = elapsed.Seconds;
}

И использовать его в форме 1:
public Form1()
{
    InitializeComponent();
    t = new Timer(); t.Tick += new EventHandler(t_Tick); t.Start();

    //time.h = 6;
    //time.m = 59;
    //time.s = 55;
    time.Reset();
}

Timer t;
_Time time = new _Time();
void t_Tick(object sender, EventArgs e)
{
    //time.CountUp();
    time.CountDown();
    label1.Text = time.h + ":"+time.m + ":" + time.s;
}

Richard MacCutchan

Обратный отсчет-это полная противоположность CountUp. Поэтому вместо того, чтобы добавлять значения, вы бы вычитали их в каждый момент, когда время должно измениться.

_Q12_

хорошо, представьте работоспособный код.
и проверьте мой [public void CountDown ()], который я уже пробовал, внизу в коде.

Richard MacCutchan

Извините, но я здесь не для того, чтобы делать за вас вашу работу.

_Q12_

тогда этот вопрос не для вас :) Это не проблема.

Richard MacCutchan

Возможно, если бы вы действительно объяснили, что не работает, а не требовали решения, тогда люди смогли бы предложить свои предложения.

BillWoodruff

- о'Кей, представь работоспособный код.- плохое отношение !

phil.o

Когда я изменяю переменную, она будет управляться DateTime, но не зависеть от DateTime.
Что это значит?

_Q12_

с "elapsed = EndTime.Вычтите(DateTime.Now);" обратный отсчет идет хорошо, но... не так, как мне хотелось. Если я установил time.m = 30, то не начинаю отсчет с 30. Это моя проблема. Вот что я имею в виду, говоря об этой идее.

phil.o

В самом начале установите EndTime к DateTime.Now.AddMinutes(30) Затем на каждом шаге вы можете получить оставшееся время с помощью EndTime - DateTime.Now. Вы также можете использовать Секундомер компонент, если вам нужно больше точности в ваших измерениях времени.
В любом случае я бы избавился от этого _Time класс, который вы определили; он просто добавляет некоторую ненужную сложность к чему-то, что может быть обработано с подлинным DateTime и TimeSpan структуры, предусмотренные рамками.

_Q12_

я думаю, что это лучшее объяснение (для сравнения)
CountUp() работает превосходно ! И под этим я подразумеваю, что если я установлю time.s или time.m на 44, то время будет начинаться с этого значения, считая вверх, правильно и как часы (а не до 10000000).
Эта функциональность мне нужна именно для обратного отсчета. Если я установлю time.s или time.m на 12, он будет отсчитывать его как часы (не до 1000000), и от этого значения я его установлю.
Прямо сейчас я просто делаю это очень неправильно с тем кодом, который у меня есть.

_Q12_

интересное предложение и я попробую его сейчас

2 Ответов

Рейтинг:
1

phil.o

Как я уже сказал в своем комментарии, старайтесь придерживаться подлинных структур и классов, предоставляемых фреймворком:
Структура DateTime[^]
Период Структуры[^]
Класс Секундомера[^] (необязательно)

Как только вы четко поймете, что эти объекты предоставляют и как их использовать, это всего лишь вопрос математических вычислений:
- couting up: установите время начала на DateTime.Now и измерьте разницу (DateTime.Now - startTime);
- обратный отсчет: установите время окончания на DateTime.Now.AddMinutes(yourDelta) и измерьте разницу (endTime - DateTime.Now).

Ключевая концепция здесь заключается в том, что вычитание двух DateTime значения приводят к тому, что TimeSpan значение, которое содержит всю необходимую вам информацию (и которую вы пытались имитировать в своем ненужном _Time класс).


_Q12_

        public void Reset()
        {
            StartTime = DateTime.Now;
            diference = new TimeSpan(h, m, s);

            //int xa = 60;
            //EndTime = new DateTime(9999, 01, 01, 0, 0, 0);

            // HERE Endtime is updating normally 
            EndTime = DateTime.Now.AddHours(h);
            EndTime = DateTime.Now.AddMinutes(m);
            EndTime = DateTime.Now.AddSeconds(s);
        }
        public void CountDown()
        {
            // HERE Endtime is Reseted to DateTime.Now and not keeping the set values from before. 
            elapsed = EndTime - DateTime.Now;


            //elapsed = EndTime.Subtract(DateTime.Now);
            //now update the values
            h = elapsed.Hours;
            m = elapsed.Minutes;
            s = elapsed.Seconds;
        }
//And in Form1
        public Form1()
        {
            InitializeComponent();
            t = new Timer(); t.Tick += new EventHandler(t_Tick); t.Start();


            time.h = 9;
            time.m = 9;
            time.s = 9;
            time.Reset();
        }

        Timer t;
        _Time time = new _Time();
        void t_Tick(object sender, EventArgs e)
        {
            time.CountDown();
            label1.Text = time.h + ":"+time.m + ":" + time.s;
        }

_Q12_

// Здесь Endtime сбрасывается на DateTime.Теперь и не сохраняя установленных значений из прошлого.
прошедшее время = EndTime - DateTime.Now;

phil.o

Вы не избавились от уродства _Time класс.
Более того, попробуйте отладить эти строки:

EndTime = DateTime.Now.AddHours(h);
EndTime = DateTime.Now.AddMinutes(m);
EndTime = DateTime.Now.AddSeconds(s);
Вы обнаружите, что вы перезаписываете значение в каждой строке; это означает, что EndTime будет только получать значение DateTime.Now.AddSeconds(s).

_Q12_

Да, здесь я допустил ошибку, не заметив изменения этой ценности. Моя вина.
Теперь я исправляю его вот этим:

        public void Reset()
        {
            TimeSpan h66t = new TimeSpan(h, m, s);
            EndTime = DateTime.Now.Add(h66t);
        }
        DateTime EndTime;
        public void CountDown()
        {
            elapsed = EndTime - DateTime.Now;
        }

Я очистил код, чтобы сделать его видимым.
Прямо сейчас нам удалось установить конечное время с помощью значений corect и что-то отсчитать. Но мне нужно вести обратный отсчет от тех значений, которые я установил в переменных. Я действительно не вижу, как я могу это сделать. Извините за это, но я слепой. И я очень ценю вашу помощь.
- Другая проблема заключается в том, что когда он достигает 0:0:0, он не уменьшается до 23:59:59, а до 0:0:-1, что действительно очень плохо.

phil.o

- эти значения я установил в переменных."
Я не знаю, что такое "эти значения" или "переменные".

"Другая проблема заключается в том, что когда он достигает 0:0:0, он не уменьшается до 23:59:59, а до 0:0:-1, что действительно очень плохо"
Почему? Это математически правильный. Если вы хотите применить определенную логику, вы должны ее реализовать.

BillWoodruff

+5 Хороший пример обучения ОП вместо того, чтобы писать для них код.

phil.o

Спасибо!

Рейтинг:
0

OriginalGriff

Два вопроса:
1) Зачем определять переменную, чтобы она содержала 60, если все, что вы делаете, - это умножаете на нее числа? И зачем называть его "ха", которое вообще ничего не значит? Если вы хотите избежать "магических чисел", то сделайте их const и назовите их соответствующим образом.
2) h-это int. Так это м, а S. А xa-это константа int. Так чего же ты ждешь new DateTime(9999, 01, 01, h * xa, m * xa, s * xa) производить? За исключением того, чтобы произвести ArgumentOutOfRangeException если h, m или s ненулевые?

Поскольку вы, похоже, вообще не запускали код - или, по крайней мере, с чем - то другим, кроме 0 в ваших смещениях, - кажется, нет особого смысла "исправлять его" для вас.

Предложение: если вам нужно "конечное время", возьмите текущее время DateTime и добавьте к нему сумму, которую вы хотите подсчитать, используя различные методы DateTime.AddXxx.
Затем, чтобы узнать, как далеко вы находитесь, вычтите из этого текущее время и используйте полученные компоненты временного интервала.


_Q12_

ха-ха, почему вы предполагаете, что я не тестирую свой код и не отлаживаю его, прежде чем задавать свои вопросы здесь? Я полагаю, что многие делают это так, и легко предположить, но... я не такой, как все остальные. Я постоянно тестирую и отлаживаю свой Код, да еще до того, как опубликовать его здесь.
Мой код пока работает ...в некотором смысле.(это говорит о том, что я уже проверяю его)
с "elapsed = EndTime.Вычтите(DateTime.Now);" обратный отсчет идет хорошо, но... не так, как мне хотелось. Если я установил time.m = 30, то не начинаю отсчет с 30. Это моя проблема.

OriginalGriff

Потому что когда вы публикуете код, который явно не будет работать, кроме как в определенных условиях (то есть он не использовался раньше), довольно очевидно, что ваш цикл тестирования / отладки не особенно интенсивен, если он вообще существует. И это то же самое для всех ваших вопросов: вы делаете одну быструю проверку (если это так) и предполагаете, что она работает во всех случаях.
Это неправильно. Попробуйте: установите любой из h, m или s на ненулевое значение и вызовите метод сброса. Работает ли он безупречно?

_Q12_

о...и о моих магических именах, я использую их, чтобы быстро проверить, что я хочу сделать. Так что это некоторые остатки моих тестов, которые я сделал до сих пор. На этот раз я специально впустил их туда, чтобы показать вам, что я попробовал все, что мог, но я сделал только 50% функционального кода, который присутствует сейчас. Извините, если это сбивает с толку. Это значит хорошо.

_Q12_

CountUp() работает превосходно ! И под этим я подразумеваю, что если я установлю time.s или time.m на 44, то время будет начинаться с этого значения, считая вверх, правильно и как часы (а не до 10000000).
Эта функциональность мне нужна именно для обратного отсчета. Если я установлю time.s или time.m на 12, он будет отсчитывать его как часы (не до 1000000), и от этого значения я его установлю.
Прямо сейчас я просто делаю это очень неправильно с тем кодом, который у меня есть.

OriginalGriff

Да. И именно поэтому я добавил предложение в конце ...

_Q12_

//Still, is not working.
       public void Reset()
        {
            StartTime = DateTime.Now;
            diference = new TimeSpan(h, m, s);


// HERE Endtime is updating normally 
            EndTime = DateTime.Now.AddHours(h);
            EndTime = DateTime.Now.AddMinutes(m);
            EndTime = DateTime.Now.AddSeconds(s);
        }
        public void CountDown()
        {
// HERE Endtime is Reseted to DateTime.Now and not keeping the set values from before. 
            elapsed = EndTime - DateTime.Now;


            //elapsed = EndTime.Subtract(DateTime.Now);
            //now update the values
            h = elapsed.Hours;
            m = elapsed.Minutes;
            s = elapsed.Seconds;
        }
//And in Form1
        public Form1()
        {
            InitializeComponent();
            t = new Timer(); t.Tick += new EventHandler(t_Tick); t.Start();


            time.h = 9;
            time.m = 9;
            time.s = 9;
            time.Reset();
        }

        Timer t;
        _Time time = new _Time();
        void t_Tick(object sender, EventArgs e)
        {
            time.CountDown();
            label1.Text = time.h + ":"+time.m + ":" + time.s;
        }

OriginalGriff

"не работает" нам ничего не говорит!
Что он делает такого, чего вы не ожидали, или не делает того, что вы сделали?
То, что вы пытались найти oue все почему? (Подсказка: что показывает отладчик, происходит?)