2016-06-30 5 views
2

Так что я делаю программу Java, которая обрабатывает фальшивую кредитную карту пользователя, и я пытаюсь сделать условный оператор проверки истечения срока действия. Однако, когда я запускаю свою программу, я получаю сообщение «String не может быть преобразовано в int». Я хотел бы знать, как использовать текущий месяц и год, чтобы проверить, действительно ли истек срок, установленный пользователем.Сравнение дат в формате MMYY

do { 
    System.out.print("Enter the expiration date mmyy: "); 
    expiration = expnum.nextInt(); 

    DateFormat dateformat = new SimpleDateFormat("MMyy"); 
    Date date = new Date(); 
    System.out.println(dateformat.format(date)); 
    int currentdate = dateformat.format(date); 

    if (currentdate <= expiration) { 
    check = check + 1; 
    } else { 
    check = 1; 
    } 
} while (check == 1); 
+3

«обрабатывает поддельный пользователя кредитной карты» ... поверхностна :) –

+1

'dateformat.format (дата)' возвращает a 'String', вам просто нужно преобразовать его в' int', используя 'Integer.parseInt (...)'. – Jashaszun

ответ

3

Хотя решение @ ManoDestra будет работать, я бы предпочел сохранить типы/данные разумными. Таким образом, вместо того, чтобы преобразовать существующую дату в int (что является своего рода бессмысленным, и format, за которым следует parse, чувствует себя отвратительно), я бы предпочел разобрать истечение на дату, а затем сравнить напрямую. Что-то вроде этого:

expiration = expnum.nextInt(); 
DateFormat dateformat = new SimpleDateFormat("MMyy"); 
Date expiryDate = dateFormat.parse(expiration); 

Date currentDate = new Date(); 

if (currentDate.isAfter(expiryDate)) { 
    // card has expired 
} else { 
    // card is still active 
} 

Вы, вероятно, нужно настроить это в зависимости от того, когда вы думаете, что на самом деле происходит истечение. Если срок истечения указан как «0816», это 01-Aug-2016 00:00:00.000, или 31-Aug-2016 23:59:59.999, или какой-то промежуток между ними?

Это вызов, который вам нужно сделать (возможно, взглянув на спецификацию кредитной карты), но это другое дело, что этот подход по сравнению с ин-конвертирующим: это не просто абстрактное чувство «использования правильных типов», но это переводит и в реальный мир. Преобразуя строку истечения в Date, вы должны думать о точно то, что представляет собой момент времени, который представляет, и точно, какие значения «сейчас» должны считаться как истекшие, а какие нет.

+0

Он по-прежнему может использовать ints для сравнения годовой/месячной комбинации, но сначала его нужно форматировать с годом, а не последним, чтобы включить сравнение года/месяца в формате кредитной карты. Я обновил свой ответ, чтобы отразить проблемы с его нынешним подходом :) – ManoDestra

-1

Это не инт. Это строка. Это неправильно:

int currentdate = dateformat.format(date); 

Если вы действительно хотите Int, а затем преобразовать его в междунар:

int currentdate = Integer.parseInt(dateformat.format(date)); 

Однако, это не будет очень разумным внутр. Если вы хотите сделать это более разумным int для сравнения, тогда вам нужно будет перенести год, ТОГДА месяц (формат: yyMM или yyyyMM). Таким образом, это будет последовательное численное сравнение, которое можно сравнить с другими датами кредитных карт. Или вы можете просто преобразовать его в Date или Calendar вместо этого и сравнить даты.

Также вы должны указать переменную check, логическое значение. Вам не нужно, чтобы это было числовое значение.

+0

Это не идеально; вам нужно сравнить даты, а не полагаться на целые числа. – Makoto

+0

Это частично решило мою проблему, но я хотел бы знать, как я могу редактировать проверку истечения срока действия, чтобы определенные значения не работали. Например, существует двенадцать месяцев, хотя, если я введу 13 в качестве ММ, программа все равно вернет значение true. – Capattax

+0

Не идеально, но это решение его проблемы и выбранного дизайна. – ManoDestra

-2

Вы можете заменить expnum.nextInt(); с Integer.parseInt (expnum.nextLine()); Это займет входную строку и преобразует ее в int. Если они не помещают int, но это произойдет через исключение, поэтому вы можете поместить это внутри оператора try-catch (и поместите это как в цикле while или что-то еще, чтобы он продолжал просить, чтобы они отвечали в правильном формате если ты хочешь).

1

YearMonth класс

YearMonth класс представляет собой, хорошо, год и месяц.

java.time

Этот класс является частью java.time структуры, построенной в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date. См. Oracle Tutorial.Большая часть функциональности была перенесена на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.

Разбор строки

Используйте DateTimeFormatter для разбора вашей входной строки. Когда столетие опущено, предполагается 21-й век 20.

String input = "0616"; 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("MMyy"); 
YearMonth expiration = YearMonth.parse (input , formatter); 

Дамп для консоли.

System.out.println ("yearMonth = " + yearMonth); 

годМесяц = ​​2016-06

Time Zone

Сравнить с текущим YearMonth. Определение текущего года-месяца означает получение текущей даты. И для определения текущей даты требуется часовой пояс. Вопрос и другие ответы игнорируют эту важную проблему. В любой момент времени по всему миру изменяется часовой пояс. Через несколько минут после того, как Париж стал новым днем, но все еще «вчера» в Монреале.

Если в качестве необязательного аргумента не указано, текущий часовой пояс JVM по умолчанию неявно применяется. Текущий по умолчанию can change at any time, даже во время выполнения (!). Лучше указать ожидаемый/желаемый часовой пояс.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
YearMonth currentYearMonth = YearMonth.now(zoneId); 

Если бизнес-правила случаются использовать UTC как часовой пояс, проходит под рукой постоянной ZoneOffset.UTC в качестве зоны аргумента времени.

Сравнить

Наконец, мы сравниваем с помощью isBefore, isAfter или equals.

Boolean expired = currentYearMonth.isAfter(expiration); 

Вместо обходе строки или целые числа за год и месяц, проходят вокруг этих YearMonth объектов. Вы получаете преимущества безопасности типов, гарантированных действительных значений и более самодокументирующего кода.

0

Сравните его в виде строки в виде yyMM, чье естественное упорядочение является правильным:

int expiration; // MMyy 
String expirationStr = String.format("%02d%02d", expiration % 100, expiration/100); 
String now = new SimpleDateFormat("yyMM").format(new Date()); 
if (expirationStr.compareTo(now) < 0) 
    // expired