Расчет прошедшего времени в C # - PullRequest
6 голосов
/ 01 марта 2010

Я работаю над алгоритмом в C # для вычисления прошлого DateTime на основе входной строки со следующими характеристиками:

Строка содержит целое число, за которым следуют «D», «M» или «Y», например «1D» или «90M».

Вывод будет DateTime.Now минус соответствующее количество дней, месяцев или лет.

Проблема, с которой я столкнулся, заключается в том, что если, например, я переключаю входную строку в регулярное выражение (D, M или Y) и вычитаю соответствующий TimeSpan из DateTime. Теперь новый конструктор TimeSpan () не принимает месяцы или годы, только дни.

if (new Regex(@"[0-9]+D").IsMatch(value))
{
    newDate = DateTime.Now - TimeSpan(Int32.Parse(value.Replace("D", "")), 0, 0);
}

Эта логика хороша, если входная строка указана в днях, но конструктор для TimeSpan не принимает месяцы или годы, и было бы невероятно неточно, если бы я предполагал, что у каждого месяца было 30 дней или у каждого года 365 дней.

У кого-нибудь есть мысли о том, как реализовать этот алгоритм?

Спасибо!

Ответы [ 5 ]

15 голосов
/ 02 марта 2010

DateTime имеет методы AddMonths, AddDays и AddYears.Используйте их с минусом, чтобы вычесть

3 голосов
/ 02 марта 2010

Не могли бы вы попробовать использовать AddDays / AddMonths / AddYears , но с отрицательными числами?

С Метод DateTime.AddDays

Значение параметра может быть отрицательным или положительны.

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

0 голосов
/ 02 марта 2010

http://msdn.microsoft.com/en-us/library/3z48198e.aspx TimeSpan.TryParse принимает очень близко к вашей строке, пока вы можете соответствовать ее форматированию ИЛИ конвертировать из вашей в ее.

0 голосов
/ 02 марта 2010

Помните, что вы также можете добавить отрицательные суммы и проверить этот метод и этот .

0 голосов
/ 02 марта 2010

Чтобы вычесть месяцы, я создаю новый DateTime и просто вычисляю месяц / год. Таким образом, 1/2010 - 6 месяцев будет 6/2010 ... как только вы установили месяц / год, вы можете посмотреть на исходный компонент даты и времени и убедиться, что он соответствует в месяце.

Вот что я сделал. Год оценивался одинаково. Вычитать дни легко; используйте для этого компонент TimeSpan.

...