Java Проверка числа месяцев - PullRequest
1 голос
/ 27 ноября 2009

Я думаю, я выясняю, какой вопрос я пытаюсь задать, я не хочу получить (Calendar.MONTH). Я хочу, чтобы месяц не был больше, чем последний календарный месяц, поэтому я делаю месяц -1, я понимаю, что если я использую get (calendar.MONTH), это становится месяцем ноября, я просто хочу посмотреть чек и убедиться, что он не больше, чем декабрь для нас 12 на компьютер 11. поэтому каждый месяц недействителен, то есть вопрос, на который я пытаюсь получить ответ!?

public Date(String inString)  
{
    int month;// is define by cutting up the inString like this
    int day; // same as month
    int getSlash;

    getSlash = inStr.indexOf('/');
    month = Integer.parseInt(inStr.substring(0,getSlash));
    day = Integer.parseInt(inStr.substring(getSlash + 1));

    inStr = String.format("%02d/%02d%n",month,day);// padformatting string
    inStr=  new SimpleDateFormat("MM/dd").format(new SimpleDateFormat("MM/dd").parse(inStr));// checking to see if a actualdate

    GregorianCalendar cal = new GregorianCalendar();

    // this is what I don't understand after reading

    if (month -1 > cal.get(Calendar.MONTH ) // how do I get it to say int of the month if the user types in 12 it gets invalid
    {
        System.out.Println("Invalid Month -> " + month");
    }

}

когда я это делаю, все, кроме 11-го месяца, считаются недействительными, кто-нибудь знает почему? Я не могу понять это.

Ответы [ 4 ]

4 голосов
/ 27 ноября 2009

Разбор дат и времени самостоятельно - плохая идея, как и использование встроенной функциональности Java.

Я не могу точно сказать, что вы хотите сделать или что не так, но я думаю, что можно с уверенностью сказать, что использование Joda Time было бы хорошей идеей.

Тогда вместо использования get с мистическими константами - и корректировки на месяцы, основанные на 0 - вы можете просто использовать ReadableDateTime.getMonthOfYear() или какой-либо другой метод с приятным названием. Гораздо приятнее.

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

int currentMonth = new DateTime().getMonthOfYear();

Использует систему календаря ISO и текущий часовой пояс по умолчанию. Лично я не слишком люблю дефолтный часовой пояс, поэтому вы можете захотеть:

int currentMonth = new DateTime(DateTimeZone.UTC).getMonthOfYear();

Я подозреваю, что система календаря ISO будет в порядке для вас, хотя:)

(Как говорит ChssPly76, cal.get(Calendar.MONTH) даст вам номер месяца на основе 0 с вашим текущим кодом, но, на мой взгляд, это ужасный API.)

РЕДАКТИРОВАТЬ: Теперь вы обновили свой вопрос, вы должны диагностировать проблему, разбив ее немного больше. Это проблема с точки зрения ввода пользователя или сравнения с текущим месяцем? Если проблема связана с битом «сравнение с текущим месяцем», это легко показать в короткой, но полной программе, в которой нет всего остального: «1024 *

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        // It's currently November
        int userInput = 11;

        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;

        if (userInput == currentMonth)
        {
            System.out.println("Yes, that's the current month");
        }
        else
        {
            System.out.println("No, the current month is " + currentMonth);
        }
    }
}

Я компенсировал java.util.Calendar, используя 0 месяцев, добавляя один к возвращенному значению, а не вычитая один из пользовательского ввода, но это та же основная предпосылка.

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

Большая часть программирования делит проблему на две части. Здесь у вас есть две проблемы:

  • Разбор пользовательского ввода
  • Сравнение с текущим месяцем

Уточните, в чём проблема, и отредактируйте свой вопрос по адресу , только этот аспект .

3 голосов
/ 27 ноября 2009

Я угадываю что вы хотите

cal.get(Calendar.MONTH)

, который вернет вам индекс с нуля индекс месяца в течение года.

Однако ваш вопрос очень неясен, и ваш код синтаксического анализа кажется немного более сложным, чем это должно быть. Возможно, если бы вы лучше объяснили, что вы пытаетесь сделать, кто-то сможет предложить лучший подход.

2 голосов
/ 27 ноября 2009

Судя по этим связанным вопросам , я думаю, у вас есть ряд проблем до этого.

Вы пытаетесь закодировать что-то, что уже закодировано, используя существующие библиотеки. Этот избыточный код вызывает конфликты.

Вы можете

A) Использовать существующую библиотеку.

B) Код решения самостоятельно, чтобы учиться.

Если вы идете за А, вам просто нужно.

public Date toDate( String inStr ) {
    return new SimpleDateFormat("MM/dd").parse(inStr);
}

И это все!

Если вы выберете B, вам нужно сначала создать алгоритм (на листе бумаги) и описать, какие шаги необходимы для решения проблемы.

как

  • Возьми строку
  • Разделить его частично на "/"
  • Конвертировать их в числа
  • Подтвердить, если первое число находится в диапазоне от 1 до 31
  • Подтвердить месяц (в 1 и 12)
  • Если месяц равен 2, то день должен быть <29 </li>

и т.д. так далее и др

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

Но если у вас нет алгоритма, вы будете бить по стенам снова и снова. И получать проблемы, как вы описываете.

Сначала заставьте его работать в газете своими словами, потом узнайте, как его кодировать.

Вот связанная запись: Процесс перехода от задачи к коду: Как вы узнали?

0 голосов
/ 28 ноября 2009

Я согласен с другими ответами; используйте SimpleDateFormat для анализа, если назначение позволяет вам.

Вы также можете использовать класс Calendar, чтобы сделать что-то подобное, отключив мягкую интерпретацию значений, затем задав поля, а затем заставив экземпляр Calendar пересчитать свои внутренние счетчики. Это вызовет исключение, если значения полей не согласованы. Вот так:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Calendar c1=new GregorianCalendar();
        c1.setLenient(false);
        c1.set(2010,1,23);        // should work: Jan. 23, 2010
        c1.getTimeInMillis();     // will revalidate the calendar fields
        System.out.println("OK: "+c1.toString());
        try {
            c1.set(2010,2,35);     // invalid date: Feb. 35, 2010
            c1.getTimeInMillis();  // revalidate... should throw exception!
            System.out.println("OK: "+c1.toString()); // never happens
        } catch(IllegalArgumentException t) {
            System.out.println("FAIL: "+c1.toString());
            t.printStackTrace();
        }
    }
}

Здесь вызовы getTimeInMillis () заставляют Calendar повторно проверять его внутренние поля; вызов вызовет исключение IllegalArgumentException, если значения не соответствуют обычному календарному времени (т.е. вне диапазона). Если вы оставите значение по умолчанию lenient = true включенным, второй вызов будет успешным, но у вас останется день марта, когда Calendar попытается выяснить, что вы имели в виду!

Единственный реальный улов заключается в том, что для правильного вычисления, подобного этому, вы должны знать, какой это год, чтобы Calendar мог выполнять расчеты високосного года, чтобы получить правильное число дней в феврале.

Если по какой-то причине вы действительно не заботитесь о году, вы можете просто жестко кодировать год, который, как вы знаете, не является високосным годом ... как 2009 год. Обязательно задокументируйте, что вы Вы делаете что-то странное, как это, хотя! Это что-то вроде хака, и это часто указывает на то, что вы делаете что-то не оптимальным способом!

Но, как уже упоминалось в других ответах, здесь, вероятно, простой и понятный ответ - либо SimpleDateFormat, либо небольшая таблица поиска на основе массива.

Надеюсь, вы найдете это образование.

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