11

您好,我正在尝试将用户输入的日期(作为字符串)与当前日期进行比较,以了解日期是否更早或更早。

我目前的代码是

String date;
Date newDate;
Date todayDate, myDate;     
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy");

while(true)
{
    Scanner s = new Scanner (System.in);
    date = s.nextLine();
    Calendar cal = Calendar.getInstance();
    try {
        // trying to parse current date here
        // newDate = dateFormatter.parse(cal.getTime().toString()); //throws exception

        // trying to parse inputted date here
        myDate = dateFormatter.parse(date); //no exception
    } catch (ParseException e) {
        e.printStackTrace(System.out);
    }

}

我试图将用户输入日期和当前日期都放入两个 Date 对象中,以便我可以使用 Date.compareTo() 来简化比较日期。

我能够将用户输入字符串解析为 Date 对象。但是,当前日期 cal.getTime().toString() 由于是无效字符串,因此不会解析为 Date 对象。

如何去做这件事?提前致谢

4

7 回答 7

9

您可以通过以下方式获取电流Date

todayDate = new Date();

编辑:由于您需要在不考虑时间部分的情况下比较日期,我建议您查看:如何比较没有时间部分的两个日期?

尽管一个答案的“糟糕的形式”,但我实际上非常喜欢它:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

在您的情况下,您已经拥有:

SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy");

所以我会考虑(为了简单而不是性能):

todayDate = dateFormatter.parse(dateFormatter.format(new Date() ));
于 2013-11-01T11:46:51.127 回答
4

这是检查给定日期时间是否大于当前日期时间的代码。下面的方法将特定的日期时间字符串作为参数,如果提供的日期时间大于当前日期时间,则返回 true。#thmharsh

private boolean isExpire(String date){
    if(date.isEmpty() || date.trim().equals("")){
        return false;
    }else{
            SimpleDateFormat sdf =  new SimpleDateFormat("MMM-dd-yyyy hh:mm:ss a"); // Jan-20-2015 1:30:55 PM
               Date d=null;
               Date d1=null;
            String today=   getToday("MMM-dd-yyyy hh:mm:ss a");
            try {
                //System.out.println("expdate>> "+date);
                //System.out.println("today>> "+today+"\n\n");
                d = sdf.parse(date);
                d1 = sdf.parse(today);
                if(d1.compareTo(d) <0){// not expired
                    return false;
                }else if(d.compareTo(d1)==0){// both date are same
                            if(d.getTime() < d1.getTime()){// not expired
                                return false;
                            }else if(d.getTime() == d1.getTime()){//expired
                                return true;
                            }else{//expired
                                return true;
                            }
                }else{//expired
                    return true;
                }
            } catch (ParseException e) {
                e.printStackTrace();                    
                return false;
            }
    }
}


  public static String getToday(String format){
     Date date = new Date();
     return new SimpleDateFormat(format).format(date);
 }
于 2015-02-05T11:01:04.780 回答
2

你可以这样做。

// Make a Calendar whose DATE part is some time yesterday.
Calendar cal = Calendar.getInstance();
cal.roll(Calendar.DATE, -1);

if (myDate.before(cal.getTime())) {
    //  myDate must be yesterday or earlier
} else {
    //  myDate must be today or later
}

cal有时间分量并不重要,因为myDate没有。因此,当您比较它们时,如果calmyDate是相同的日期,则时间分量将cal晚于myDate,而不管时间分量是什么。

于 2013-11-01T11:56:48.543 回答
2
 public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.

for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

SimpleDateFormat sdf1234 = new SimpleDateFormat("dd-MM-yyyy hh:mm a");
                    String abs12 = value.getExpiryData();

                    Date todayDate = new Date();

                    try {
                        Date testDate1 = sdf1234.parse(abs12);

                        if(testDate1.compareTo(todayDate) <0){//  expired
                            dataSnapshot1.getRef().removeValue();
                        }
                        else if(testDate1.compareTo(todayDate)==0){// both date are same
                            if(testDate1.getTime() == todayDate.getTime() || testDate1.getTime() < todayDate.getTime())
                            {//  expired
                                dataSnapshot1.getRef().removeValue();
                            }
                            else
                                {//expired
                                //Toast.makeText(getApplicationContext(),"Successful praju ",Toast.LENGTH_SHORT).show();
                            }
                        }else{//expired
                           // Toast.makeText(getApplicationContext(),"Successful praju ",Toast.LENGTH_SHORT).show();
                        }
 } }
于 2018-10-30T23:19:26.127 回答
1

创建一个新的 Date() 将为您提供一个带有当前日期的 Date 对象。

所以:

    Date currentDate = new Date();

会做这项工作

于 2013-11-01T12:06:55.120 回答
0

Fomat 不符合您的预期。

 Calendar cal = Calendar.getInstance();
      System.out.println(cal.getTime().toString());

输出:2013 年 11 月 1 日星期五 13:46:52 EET

于 2013-11-01T11:49:44.283 回答
0

java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。

    ZoneId zone = ZoneId.of("America/Santarem");
    LocalDate today = LocalDate.now(zone);
    
    String userInput = "14-04-2021";
    LocalDate myDate = LocalDate.parse(userInput, DATE_PARSER);
    
    if (myDate.isBefore(today)) {
        System.out.println(userInput + " is in the past.");
    } else if (myDate.isAfter(today)) {
        System.out.println(userInput + " is in the future.");
    } else {
        System.out.println(userInput + " is today.");
    }

输出是:

14-04-2021 已成为过去。

我使用此格式化程序进行解析:

private static final DateTimeFormatter DATE_PARSER
        = DateTimeFormatter.ofPattern("dd-MM-uuuu");

你的代码出了什么问题?

我评论了你得到异常的那一行:

            // trying to parse current date here
            newDate = dateFormatter.parse(cal.getTime().toString()); //throws exception

果然我得到了这个例外:

java.text.ParseException:无法解析的日期:“Fri Apr 16 07:37:00 CEST 2021”

SimpleDateFormat尝试解析格式中的字符串dd-MM-yyyycal.getTime()返回 a Date,并且atoString()上的值Date看起来像异常所说的那样,Fri Apr 16 07:37:00 CEST 2021. 这不是dd-MM-yyyy格式(甚至没有关闭)。这就是为什么解析失败并出现您看到的异常的原因。

使用 java.time 根本没有必要解析今天的日期,因为您没有将它作为字符串获取。使用 Java 1.0 和 1.1 中的旧且麻烦的日期类,它可以用作摆脱Date.

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2021-04-16T05:40:51.010 回答