2014-10-09 2 views
0

В моей WinForm пользовательский ввод в текстовое поле даты как '210514' или '231113 (в формате ddmmyy) Предположим, что сегодня дата = 291014 (29-окт-14). Использование Visual Studio 2010 C# 4.0. Установка даты на ПК: GMT +08: 00 дд-МММ-гг.Как проверить дату между двумя датами (не SQL)

CodeBehind:

// Split the input string into YYMMDD format and set it to a date object 
DateTime inputDate = new DateTime(Convert.ToInt32(input.Substring(4, 2)), Convert.ToInt32(input.Substring(2, 2)), Convert.ToInt32(input.Substring(0, 2))); 

// WinForm позволяет пользователю дату ввода не ранее чем за 2 года до даты сегодня и не более 1 месяца со дня сегодня.

DateTime minDate = DateTime.Now.AddMonths(-24); 
DateTime maxDate = DateTime.Now.AddMonths(1); 

Я пробовал много методов, но никто не работает (я также проверил множество тем/форумов).

//Method 1 
if(inputDate >= minDate && inputDate <= maxDate) 
    return true 

//Method 2: B return true but A ***always*** return false, Why?? 
if (inputDate >= minDate) 
    A = true; 

if (inputDate <= maxDate) 
    B = true; 

//Method 3: B return true but A ***always*** return false, Why?? 
if ((DateTime.Now - inputDate).Days >= (DateTime.Now - minDate).Days) 
    A = true; 

if (inputDate <= maxDate) 
    B = true; 
+4

Во-первых, я бы предложил элементы 'DateTimePicker', а не' TextBoxes'. Если вы должны использовать 'TextBoxes', хотя, по крайней мере, используйте' DateTime.TryParseExact' для проверки и преобразования 'String' в' DateTime'. – jmcilhinney

+0

Привет, jmcilhinney, наш клиент настаивает на том, чтобы вместо текстового ввода вместо текстового поля было указано текстовое поле, потому что они хотели ввести формат ddmmyy без выбора с помощью мыши. – furor

+0

Затем, как я уже сказал, вы должны использовать 'DateTime.TryParseExact', чтобы сначала проверить данные, которые могут быть любыми в« TextBox », а затем преобразовать данные в значение« DateTime ». – jmcilhinney

ответ

0

Я отправляю это как ответ, так что я могу опубликовать код. Я просто сделал это:

DateTime inputDate; 

if (DateTime.TryParseExact(this.textBox1.Text, "ddMMyy", null, DateTimeStyles.None, out inputDate)) 
{ 
    var minDate = DateTime.Today.AddYears(-2); 
    var maxDate = DateTime.Today.AddMonths(1); 
    var A = inputDate >= minDate; 
    var B = inputDate <= maxDate; 

    MessageBox.Show(string.Format("input: {1:d}{0}min: {2:d}{0}max: {3:d}{0}A: {4}{0}B: {5}", 
            Environment.NewLine, 
            inputDate, 
            minDate, 
            maxDate, 
            A, 
            B)); 
} 
else 
{ 
    MessageBox.Show("Invalid input"); 
} 

Я вошел «091014» в моем TextBox и сообщение сказал, что A был true. Аналогично для «101012» и «101014». Если что-то в вашей системе не повреждено, это не код, а скорее вы ошибаетесь. Проверьте этот точный код и посмотрите, получится ли у вас тот же результат.

+0

На самом деле я хотел сделать простое приложение и разместить его на своем веб-сайте для вас, ребята, чтобы скачать и попробовать. Ваш код работает, и я нашел проблему. По праву, мои коды * должны * работать. Разница в том, что я поставил minDate = DateTime.Now.AddMonths (-24). Это ошибка. Как ни странно. Когда я перешел на .AddYears (-2), все остальные методы работали. – furor

+0

Я только что изменил свой тестовый код, чтобы использовать 'DateTime.Today.AddMonths (-24)', и он по-прежнему работал точно так, как должен. Либо вы сделали что-то еще неправильно, либо что-то было нарушено в вашем проекте. – jmcilhinney

+0

Nevermind, по какой-то причине VS просто разбился, когда я рисовал коды. – furor

1

Метод A правильный, и вы бы поняли, почему он не работает, если вы используете отладчик.

string input = "291014"; 
DateTime inputDate = new DateTime(
    Convert.ToInt32(input.Substring(4, 2)), 
    Convert.ToInt32(input.Substring(2, 2)), 
    Convert.ToInt32(input.Substring(0, 2))); 

Console.WriteLine(inputDate.Year); // 14, oops 
Console.WriteLine(DateTime.Now.Year); // 2014 

Чтобы исправить это добавить 2000 к году

DateTime inputDate = new DateTime(
    2000 + Convert.ToInt32(input.Substring(4, 2)), 
    Convert.ToInt32(input.Substring(2, 2)), 
    Convert.ToInt32(input.Substring(0, 2))); 
+0

Интересно. Это что-то для меня, чтобы принять к сведению. Спасибо Дирк. – furor

+0

Y2K только что случилось .... возможно Y.01K – TyCobb

Смежные вопросы