【问题标题】:Comparing dates?比较日期?
【发布时间】:2018-11-24 23:04:18
【问题描述】:

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

当我写这篇文章时

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

如果我像这样尝试并抓住

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

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 很难从分离的代码中看出你缺少什么。如果您create a Minimal, Complete, and Verifiable example,我们可以为您提供更好的帮助。
  • 您可以在this answer 中找到好的灵感,并且通常使用您的搜索引擎来找到更多。类似的问题已经被问过很多次了。
  • 在 Stack Overflow 上,您应该将源代码和错误消息作为文本发布,而不是屏幕截图。 Stack Overflow 具有基于 Markdown 语法格式化此类文本的功能。

标签: java android date compare date-comparison


【解决方案1】:

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

好方法

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

演示

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

【讨论】:

    【解决方案2】:

    tl;博士

    您的问题实际上与比较日期无关。您的问题是尝试从其范围之外引用局部变量。

    范围

    在您尝试使用strDateonClick 方法中:

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

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

    【讨论】:

      【解决方案3】:

      用它来比较两个日期

      首先将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;
                  }
      

      【讨论】:

        【解决方案4】:

        试试这个

        @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();
                      }
                }
        

        【讨论】:

          猜你喜欢
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-20
          • 2020-09-08
          • 2012-09-06
          • 2015-12-29
          • 2017-12-06
          相关资源
          最近更新 更多