【问题标题】:Android: Check whether the system date is less than or equal to a specified date [duplicate]Android:检查系统日期是否小于或等于指定日期[重复]
【发布时间】:2013-11-08 04:38:13
【问题描述】:

在我的 android 应用程序中有一个用户定义的日期。此日期应大于或等于系统日期。如果是,则过程将继续。如果不是,则表示祝酒跟进日期应大于或等于系统日期

我使用了这个代码段。

if (sys_date.after(df.parse((date.getText().toString())))) {
    Toast.makeText(getActivity(), "Follow up date should be greater than or equal to system date", Toast.LENGTH_SHORT).show();
} else {
    //process will continue
}

但问题是:即使用户定义的日期等于系统日期,它也会发出 toast 消息。

任何人都可以很好地解释这里发生了什么以及我该如何解决这个问题。

提前感谢

【问题讨论】:

  • 你解析正确了吗??
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。在ThreeTen-Backport 项目中,大部分java.time 功能都被反向移植到Java 6 和Java 7。在ThreeTenABP 项目中进一步适用于早期的Android。见How to use ThreeTenABP…

标签: java android date compare


【解决方案1】:

我正在使用这个

public static boolean isAfterToday(int year, int month, int day)
{
    Calendar today = Calendar.getInstance();
    Calendar myDate = Calendar.getInstance();

    myDate.set(year, month, day);

    if (myDate.before(today)) 
    {
        return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:

    我已使此方法验证所有可能的日期验证。它可以帮助你。

        public static final int DATE_EQUAL_TO_TODAY = 1;
        public static final int DATE_EQUAL_TO_GREATER_THAN_TODAY = 2;
        public static final int DATE_EQUAL_TO_LESS_THAN_TODAY = 3;
        public static final int END_DATE_GREATER_OR_EQUAL_TO_START_DATE=4;
        public static final int END_DATE_CAN_GREATER_THAN_TODAY=5;
        public static int DATE_SHOULD_BE_GREATER_THAN_TODAY=6;
        public static boolean dateVadidation(String date,int validationType)
        {
        String currentDate = showDateFormat(System.currentTimeMillis());
        SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy");
        if (validationType == DATE_EQUAL_TO_TODAY) {
    
            try {
    
                Date dtCurrent = df.parse(currentDate);
    
    
                Date dtCompareWith = df.parse(date);
    
                return dtCurrent.before(dtCompareWith)  || dtCurrent.after(dtCompareWith);
    
            } catch (Exception e) {
                Log.e("DATE_EQUAL_TO_TODAY", "Date Parsing Exception:" + e.getMessage());
            }
        }
        if(validationType == DATE_EQUAL_TO_GREATER_THAN_TODAY)
        {
            try {
    
                Date dtCurrent = df.parse(currentDate);
    
    
                Date dtCompareWith = df.parse(date);
    
                return dtCurrent.after(dtCompareWith);
    
    
            } catch (Exception e) {
                Log.e("DATE_EQUAL_TO_GREATER_THAN_TODAY", "Date Parsing Exception:" + e.getMessage());
            }
        }
        if(validationType == DATE_EQUAL_TO_LESS_THAN_TODAY)
        {
            try {
    
                Date dtCurrent = df.parse(currentDate);
    
    
                Date dtCompareWith = df.parse(date);
    
                return dtCurrent.before(dtCompareWith);
    
            } catch (Exception e) {
                Log.e("DATE_EQUAL_TO_LESS_THAN_TODAY", "Date Parsing Exception:" + e.getMessage());
    
            }
        }
    
        if(validationType==END_DATE_CAN_GREATER_THAN_TODAY)
        {
        try {
    
    
            Date dtTo = df.parse(date);
    
            Date dtCurrent = df.parse(currentDate);
    
            return dtTo.before(dtCurrent) ;
    
        }
    
        catch (Exception e) {
            Log.e("END_DATE_CAN_GREATER_THAN_TODAY", "Date Parsing Exception:" + e.getMessage());
        }
        }
    
        if(validationType==DATE_SHOULD_BE_GREATER_THAN_TODAY)
        {
        try {
    
    
            Date dtTo = df.parse(date);
    
            Date dtCurrent = df.parse(currentDate);
    
    
            return (dtTo.after(dtCurrent) && (! dtTo.equals(dtCurrent))) ;
    
        }
        catch (Exception e) {
            Log.e("DATE_SHOULD_BE_GREATER_THAN_TODAY", "Date Parsing Exception:" + e.getMessage());
        }
        }
        return false;
    
    }
    

    【讨论】:

    • END_DATE_CAN_GREATER_THAN_TODAY 的验证似乎有一个错误 - 不应该是 dtTo.after(dtCurrent)
    • 刚刚发布了与 END_DATE_CAN_GREATER_THAN_TODAY 语义相关的查询
    • 是的,您可以将此常量作为参数传递给方法。什么问题?我们经常使用所有可能的验证类型。
    • 让我具体一点 - 返回 dtTo.before(dtCurrent) ;实际上应该返回 dtTo.after(dtCurrent) 假设 dtTo 表示 END DATE 并且它可以大于当前日期。
    • 可能有问题。所以它可以通过使用来纠正!操作员或直接改变方法。但这个想法是一样的
    【解决方案3】:

    如果您想在忽略时间部分后比较日期,那么this SO 问题将为您提供见解。另请参阅 Pankaj Kumar

    发布的 SO 问题链接

    Date 对象实现 Comparable 接口。因此,您可以使用 compareTo 方法进行精确的日期比较(包括时间组件)。当然,如果 Date.getTime() 方法为被比较的两个日期实例返回相同的 long 值,那么 Date.equals() 将返回 true。

    我建议使用成熟的库,例如 Joda。注意here 讨论的一些内存问题和解决方法。

    【讨论】:

      【解决方案4】:
      1. 将日期字符串转换为日历,并从中获取以毫秒为单位的时间。您必须使用 DateFormatter 进行转换。

      2. 获取另一个 Calendar 对象并在另一个 long 中获取以 MilliSeconds 为单位的时间。现在是系统时间。

      3. 比较以上两个长变量。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2016-09-25
        • 2020-12-14
        • 2023-03-19
        • 2012-02-24
        • 2015-03-11
        • 2014-12-26
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多