2010-03-01 8 views
6

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

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

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

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

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

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

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

Спасибо!

+0

У _you_ есть мысли о том, как его реализовать? Потому что до сих пор ваша техника выглядит так: «спросите о SO, и, возможно, кто-то сделает это за меня». Расскажите, что вы уже пробовали! –

ответ

15

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

+0

Самый разумный и читаемый способ сделать это –

+0

По какой-то ужасной причине я решил, что для этого нужно использовать метод SubtractDays и т. Д. Оказывается, что добавление негативов имеет тот же эффект. Мне, возможно, придется отыскать базовый курс алгебры ... ТЫ !!! –

0

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

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

3

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

От DateTime.AddDays Method

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

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

0

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