在Java 6中将字符串日期与当前日期进行比较

时间:2018-11-09 09:02:41

标签: simpledateformat java-6 java-date

这是一个程序,它比较输入的字符串date(expdate)和当前日期(today),并且仅在expDate大于当前日期时返回“有效的Expiry Date”。

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 :(得分:0)

Java 6的java.time和ThreeTen Backport

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");
            }
        }
    }

}

我今天(11月9日)跑步时的输出:

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

LocalDate是没有时间的日期,因此似乎比老式的Date更适合您的要求,老式java.time的名称是时间点,而不是日期。因此,上面的代码也比您的代码简单。

由于在所有时区中都不会是同一日期,所以我为可预测的结果明确指定了时区。

在我的Java 6上可以使用吗?

是的,java.time仅需要至少 Java 6 (我已经在Java 7上测试了上面的代码)。

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。在这种情况下,请从org.threeten.bp包中导入带有子包( not org.threeten.bp)的类。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从mm导入日期和时间类。

您的代码出了什么问题?

在您的两个格式化程序中,您每月使用mm,这是错误的。小写MM表示每小时的分钟。对于月份,您需要使用大写的SimpleDateFormat。所有格式模式字母均区分大小写。

java.time类的典型做法是给您一个不正确的结果,并假装一切都很好。这只是那堂课的许多麻烦之一。这也是我建议使用现代Java日期和时间API java.time的众多原因之一。

链接