Сравните строковую дату с текущей датой в Java 6 - PullRequest
0 голосов
/ 09 ноября 2018

Это программа, которая сравнивает дату входной строки (expdate) с текущей датой (сегодня) и возвращает «действительную дату истечения», только если expDate больше текущей даты.

import java.util.*;
import java.lang.*;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/* Name of the class has to be "Main" only if the class is public. */
class expiryDateLogic
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String expdate = "07-11-2018"; // Text Date Input
        if (!expdate.equals("")) { // If null no checking
            DateFormat format = new SimpleDateFormat("dd-mm-yyyy");
            Date expDate = (Date) format.parse(expdate); // Convert expdate to type Date
            SimpleDateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
            Date current = new Date();
            String td = formatter.format(current);
            Date today = (Date) formatter.parse(td); // Current date
            System.out.println(today);
            System.out.println(expDate);
            // System.out.println(expDate.compareTo(today));
            if (expDate.before(today)) { // Date Comparison
                System.out.println("Invalid Expiry Date");
            } else {
                System.out.println("Valid Expiry Date");
            }
        } else {
            System.out.println("No Expiry Date Present");
        }
    }
}

Этот код не работает, если expDate является текущей датой. Пожалуйста, помогите

1 Ответ

0 голосов
/ 09 ноября 2018

java.time и ThreeTen Backport для Java 6

import org.threeten.bp.LocalDate;
import org.threeten.bp.ZoneId;
import org.threeten.bp.format.DateTimeFormatter;

public class ExpiryDateLogic {

    public static void main(String[] args) {
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
        ZoneId zone = ZoneId.of("Asia/Kolkata");

        String expDateString = "07-11-2018"; // Text Date Input
        if (expDateString.isEmpty()) {
            System.out.println("No Expiry Date Present");
        } else {
            LocalDate expDate = LocalDate.parse(expDateString, dateFormatter);
            LocalDate today = LocalDate.now(zone);
            System.out.println("Today:      " + today);
            System.out.println("Expiration: " + expDate);
            if (expDate.isBefore(today)) {
                System.out.println("Invalid Expiry Date");
            } else {
                System.out.println("Valid Expiry Date");
            }
        }
    }

}

Вывод, когда я бегу сегодня (9 ноября):

Today:      2018-11-09
Expiration: 2018-11-07
Invalid Expiry Date

A LocalDate - это дата без времени суток, поэтому, похоже, она соответствует вашему требованию лучше, чем старомодный Date, который, несмотря на свое название, является моментом времени, а не датой. Таким образом, приведенный выше код также проще, чем ваш код.

Поскольку это не одна и та же дата во всех часовых поясах, я явно указываю часовой пояс для предсказуемых результатов.

Будет ли это работать на моей Java 6?

Да, java.time требует как минимум Java 6 (я тестировал код выше на Java 7).

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный API поставляется встроенным. В этом случае импортируйте классы из пакета java.time с подпакетами (, а не org.threeten.bp).
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Что не так в вашем коде?

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

Для класса SimpleDateFormat характерно просто давать вам неверный результат и делать вид, что все хорошо. Это всего лишь одна из многих проблем с этим классом. И одна из многих причин, почему я предлагаю вместо этого использовать java.time, современный Java-интерфейс даты и времени.

Ссылки

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