Tamika Reisman Ответов: 2

Как преобразовать даты в целое число в C#?


Что я хочу сделать, так это показать ход обратного отсчета на индикаторе прогресса, но я не знаю, как преобразовать даты в целые числа, чтобы вычислить процент для индикатора прогресса?

Спасибо.

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

public Form1()
{
    Timer t = new Timer();
    t.Interval = 1000;
    t.Tick += countdown;
    t.Start();

}

private void countdown(object sender, EventArgs e)
{
    DateTime endDate = DateTime.Parse("12/24/2017");
    DateTime startDate = DateTime.Now;

    TimeSpan timeDiff = endDate - startDate;
    int timeDiffPercent = (timeDiff / endDate) * 100; //How?
    timeLeft.Text = dateDiff;

    timeLeftBar.Value = timeDiffPercent;
}

Richard MacCutchan

Сначала вам нужно знать общее значение, которое вы должны использовать для расчета процента во время выполнения.

F-ES Sitecore

Если конечная дата-24 декабря 2017 года, а сегодня-4 июля, то какой это процент? Какой процент будет 1 декабря? Проценты работают с числами, потому что мы можем предположить нижнюю границу 0. Правда, с датами....что такое нижняя граница? 1 января для рассматриваемого года (1/1/17 в вашем примере). 1/1/1900? 1/1/0000? 4 миллиарда лет назад, когда началось время? Чтобы быть процентом вдоль пути, вам нужны верхняя граница, нижняя граница и текущее значение. Мы знаем верхнюю границу и текущее значение, но какова ваша нижняя граница?

Tamika Reisman

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

F-ES Sitecore

Взгляните на решение, которое я опубликовал

Ralf Meier

Какая часть промежутка времени вас интересует ? Миллисекунды, Секунды, Минуты ...? Или что-то особенное ?
Если вы хотите вычислить процентное значение-на что вы ссылаетесь ? Это может быть только частное от вашей временной части и значение, которое вы ожидаете ...

Tamika Reisman

Это в считанные секунды, в первый день года.

Ralf Meier

Таким образом, Вы должны вычислить второе значение с первого дня года, а также с фактической даты и с последней даты года.
Теперь ваш процент равен actDate_SecondValue / (lastDay_SecondValue - fisrtDay_SecondValue)... это все...

2 Ответов

Рейтинг:
2

F-ES Sitecore

// the start date will be 1 Jan of the current year
DateTime startDate = new DateTime(DateTime.Now.Year, 1, 1);
DateTime endDate = DateTime.ParseExact("12/24/2017", "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture);

// in this example I'm going to get the % for all days from start to finish
// you're only really interested in currentDate = DateTime.Now and don't need
// the while loop
DateTime currentDate = startDate;

while (currentDate <= endDate)
{
    // get the ticks relative to start date.  Google for what ticks are
    // but they are effectively a numeric value for a date
    long endTicks = endDate.Ticks - startDate.Ticks;
    long nowTicks = currentDate.Ticks - startDate.Ticks;

    // now get the % using traditional maths
    int pc = (int)(decimal.Divide(nowTicks, endTicks) * 100);

    System.Diagnostics.Debug.WriteLine(string.Format("Date: {0} {1}%", currentDate, pc));

    currentDate = currentDate.AddDays(1);

}


Рейтинг:
14

OriginalGriff

Проблема заключается в том, что процент завершения является скользящим значением фиксированного диапазона: и каждый тик вы не ссылаетесь на фиксированный старт, а вместо этого используете текущее время.
Начните с установки фиксированного начала и конца:

private DateTime dtStart;
private DateTime dtEnd;
public Form1()
    {
    Timer t = new Timer();
    t.Interval = 1000;
    t.Tick += countdown;
    dtStart = DateTime.Now;
    dtEnd = new DateTime(2017, 12, 24);
    t.Start();
    }
А затем использовать их в расчете тика:
private void countdown(object sender, EventArgs e)
    {
    DateTime now = Datetime.Now;
    double total = (dtEnd - dtStart).TotalMinutes;
    double elapsed = (now - dtStart).TotalMinutes;
    double percent = (elapsed / total) * 100.0;
    ...
    }