С процентами, как я могу получить время между двумя датами? - PullRequest
0 голосов
/ 05 апреля 2019

Я думаю, что лучший способ описать это - использовать примеры.Диапазон между 4:00 и 4:00 вечера.На 0% я хочу вернуть 4:00am.На 100% я хочу вернуть 4:00pm.На 50% я хочу вернуть 10:00am.

Вопрос в том, как мне получить эту функциональность с этой подписью?

string GetTime(percentage, startTime, endTime)

Ответы [ 4 ]

4 голосов
/ 05 апреля 2019

Предполагая, что оба DateTimes находятся в одном часовом поясе, и что перехода нет (начало / конец летнего времени, изменение местного часа и т. Д.):

public static void Main()
{
    var startTime = new DateTime(2019, 01, 01, 4, 0, 0);
    var endTime = new DateTime(2019, 01, 01, 16, 0 , 0);

    // prints 10:00 AM
    Console.WriteLine(GetTime(0.5, startTime, endTime));
}

private static string GetTime(double percentage, DateTime startTime, DateTime endTime)
{
    // get the difference between the dates
    // you could use TotalSeconds or a higher precision if needed
    var diff = (endTime - startTime).TotalMinutes;

    // multiply the result by the percentage
    // assuming a range of [0.0, 1.0]
    double minutes = diff * percentage;

    // add the minutes (or precision chosen) to the startTime
    var result = startTime.AddMinutes(minutes);

    // and get the result
    return result.ToShortTimeString();
}

Вы можете проверить это в этой скрипке: https://dotnetfiddle.net/g4gHLJ

2 голосов
/ 05 апреля 2019

Вы должны вернуть TimeSpan вместо string. Вот как бы я это сделал:

static TimeSpan GetTime(double percentage, TimeSpan startTime, TimeSpan endTime)
{
    var percentageInTicks = (long)((endTime - startTime).Ticks * percentage);
    return startTime.Add(TimeSpan.FromTicks(percentageInTicks));
}

Использование:

TimeSpan startTime = new TimeSpan(4, 0, 0);
TimeSpan endTime = new TimeSpan(16, 0, 0);
double[] percentages = new[] { 0, 0.5, 1 };

foreach (double percentage in percentages)
{
    var result = GetTime(percentage, startTime, endTime);
    Console.WriteLine(result.ToString());
}

Выход:

04:00:00
10:00:00
16:00:00

Редактировать: Вы можете сделать то же самое с DateTime, если хотите:

static TimeSpan GetTime(double percentage, DateTime startDate, DateTime endDate)
{
    var percentageInTicks = (long)((endDate - startDate).Ticks * percentage);
    return startDate.TimeOfDay.Add(TimeSpan.FromTicks(percentageInTicks));
}

Использование:

DateTime startDate = DateTime.Today.Add(new TimeSpan(4, 0, 0));
DateTime endDate = DateTime.Today.Add(new TimeSpan(16, 0, 0));
double[] percentages = new[] { 0, 0.5, 1 };

foreach (double percentage in percentages)
{
    var result = GetTime(percentage, startDate, startDate);
    Console.WriteLine(result.ToString());
}
0 голосов
/ 05 апреля 2019

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

DateTime GetTime(double percentage, DateTime startTime, DateTime endTime)
{
    var duration = endTime - startTime;
    var partDuration = percentage * (double)duration.TotalMilliseconds;
    return startTime.AddMilliseconds(partDuration);
}


GetTime(0.5, DateTime.Today.AddHours(4), DateTime.Today.AddHours(16)).Dump();
0 голосов
/ 05 апреля 2019

Вот как это сделать с помощью DateTimes в качестве входов и выходов:

 public static DateTime GetTime(double percentage, DateTime startTime, DateTime endTime)
 {
     TimeSpan diff = endTime - startTime;
     long percentOfTimeAsTicks = (long) (percentage * diff.Ticks);
     return startTime + new TimeSpan(percentOfTimeAsTicks);
 }

Как отметил @MattJohnson, два DateTime должны быть на одной основе (либо UTC, либо оба в одном и том же часовом поясе с одинаковым летом / зимой).

Использование Ticks вместо секунд или минут даст вам наибольшую точность.

Вот простой тест:

  var start = DateTime.Today;
  var end = DateTime.Now;
  Debug.WriteLine(Struct128.GetTime(0.5, start, end));

Это распечатывает время как раз перед 9:00 утра (здесь в настоящее время как раз перед 18:00).

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