比较日期?

我正在尝试比较Android中的两个日期,但我得到了这个

通知

当我写这个

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy"); String valid_until = "26052018"; final Date strDate = sdf.parse(valid_until); 

如果我把尝试和这样的抓住

尝试抓住

我无法比较日期,因为它说我没有声明strDate

无法比较

SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。 它允许格式化(日期→文本),解析(文本→日期)和规范化。

好方法

  • 您应该使用PROPER日期格式。

DEMO

 Date strDate=null; // Declare as global; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); String valid_until = "26/05/2018"; strDate = sdf.parse(valid_until); if (new Date().after(strDate)) { } 

您可以访问Best way to compare dates in Android

TL;博士

你的问题不是关于比较日期。 您的问题是尝试从其范围之外引用局部变量。

范围

在您尝试使用strDate onClick方法中:

 if( new Date().after( strDate ) ) 

……范围内没有这样的变量strDate 。 方法没有看到在其他方法(*)中定义的局部变量。 这就是为什么它们被称为“本地”,它们不存在于定义它们的方法之外。

范围可以更窄。 在花括号内声明的局部变量(例如在if语句中)在这些花括号之外不存在。

要从另一个方法访问strDate ,您必须使其可用。 一种方法是在调用方法时将变量作为参数传递。 另一种方法是将变量声明为类的成员,如果两个地方都填充并在同一个类中使用变量。

java.time

正如其他人所指出的那样,你应该避免使用非常棘手的旧日期时间类,例如java.util.Date 。 几年前,业界领先的java.time类取代了这些。

 LocalDate.parse( "26052018" , DateTimeFormatter.ofPattern( "ddMMuuuu" ) ) 

搜索Stack Overflow以了解如何将字符串解析为LocalDate对象。

并避免使用问题中所示的自定义日期格式。 只要有可能,请坚持使用标准的ISO 8601格式。 对于仅限日期的值,即YYYY-MM-DD。 再次,搜索Stack Overflow来学习。

 LocalDate.parse( "2018-05-26" ) 

(*)方法有一些迂回的方法来查看在其他方法中定义的局部变量。 这些包括反思/内省和内部类。 但它们是特殊情况。

用它来比较两个日期

首先将String转换为日期对象

 SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss", Locale.US); Date d1, d2; try { d1 = inputFormat.parse(yourStringDate); d2 = inputFormat.parse(yourStringDate); return d2.compareTo(d1); } catch (ParseException e) { e.printStackTrace(); return 0; } 

试试这个

 @Override public void onClick(View v) { SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy"); String valid_until = "26052018"; Date strDate = null; try { strDate = sdf.parse(valid_until); if(new Date().after(strDate)){ startActivity(new Intent(MainActivity.this,Error.class)); } } catch (ParseException e) { e.printStackTrace(); } }