【问题标题】:Getting difference between two dates Android获取两个日期之间的差异Android
【发布时间】:2011-08-01 10:19:06
【问题描述】:

我有字符串发布日期,例如:

2011-03-27T09:39:01.607

并且有当前日期。

我想以以下形式获取这两个日期之间的差异:

2 days ago 
1 minute ago etc..

取决于发布日期。

我正在使用此代码将发布日期转换为毫秒:

public long Date_to_MilliSeconds(int day, int month, int year, int hour, int minute) {
    Calendar c = Calendar.getInstance();
    c.set(year, month, day, hour, minute, 00);
    return c.getTimeInMillis();
}

当前日期:long now = System.currentTimeMillis();

并计算差异:

String difference = (String) DateUtils.getRelativeTimeSpanString(time,now, 0);

但它会像May 1 , 1970 或其他东西一样返回......

如何获取发布日期和当前日期之间的差异。

【问题讨论】:

标签: java android date


【解决方案1】:

您可以使用getRelativeTimeSpanString()。它返回一个类似“1 分钟前”的字符串。这是一个真正简单的示例,说明应用程序运行了多长时间。

private long mStartTime;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mStartTime = System.currentTimeMillis();
}

public void handleHowLongClick(View v) {
    CharSequence cs = DateUtils.getRelativeTimeSpanString(mStartTime);
    Toast.makeText(this, cs, Toast.LENGTH_LONG).show();
}

【讨论】:

  • +1 使用 Android API!这应该是公认的答案!
【解决方案2】:

将两个日期转换成日历,使时间为0(

today.set(Calendar.HOUR_OF_DAY, 0);
    today.set(Calendar.MINUTE, 0);
    today.set(Calendar.SECOND, 0);

)。
然后使用这个乐趣:

public final static long SECOND_MILLIS = 1000;
public final static long MINUTE_MILLIS = SECOND_MILLIS*60;
public final static long HOUR_MILLIS = MINUTE_MILLIS*60;
public final static long DAY_MILLIS = HOUR_MILLIS*24;

 public static int daysDiff( Date earlierDate, Date laterDate )
    {
        if( earlierDate == null || laterDate == null ) return 0;
        return (int)((laterDate.getTime()/DAY_MILLIS) - (earlierDate.getTime()/DAY_MILLIS));
    }

【讨论】:

    【解决方案3】:

    尝试我在其中一个应用程序中使用的以下方法:

    /**
     * Returns difference between time and current time as string like:
     * "23 mins ago" relative to current time.
     * @param time - The time to compare with current time in yyyy-MM-dd HH:mm:ss format
     * @param currentTime - Present time in yyyy-MM-dd HH:mm:ss format
     * @return String - The time difference as relative text(e.g. 23 mins ago)
     * @throws ParseException
     */
    private String getTimeDiff(String time, String currentTime) throws ParseException
    {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date currentDate = (Date)formatter.parse(currentTime);
        Date oldDate = (Date)formatter.parse(time);
        long oldMillis = oldDate.getTime();
        long currentMillis = currentDate.getTime();
        return DateUtils.getRelativeTimeSpanString(oldMillis, currentMillis, 0).toString();
    }
    

    【讨论】:

      【解决方案4】:

      实现这一点的简单方法:

      1. 在您的项目中导入 joda 库。

      2. 将您的当前日期和未来日期存储在这样的变量中

        //here currenDate and futureDate are of calendar type.
        LocalDateTime currentDateTime = LocalDateTime.fromCalendarFields(currentDate);
        LocalDateTime futureDateTime = LocalDateTime.fromCalendarFields(futureDate);
        
      3. 现在你要做的是计算两个日期之间的差异并保存差异,这个差异将用于从下一个字段中减去。

        例如:我们必须显示年、月、周……等等。在计算两个日期之间的年数后,我们将从月份中减去年数,对于下一个字段也是如此...日期时间的层次结构如下...

        年-月-周-日-时-分-秒

        现在是sn-p

        /**
         * 
         * @param context which activity its calling
         * @param currentDateTime current time 
         * @param futureDateTime future time from which we have to calculate difference
         * @param selectedUnitsFromSettings which units we have to find difference such as years,weeks....etc
         *  which will be stored in list...
         * @return
         */
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static HashMap dateBasedOnUnitCalculator(
                Context ctx, LocalDateTime currentDateTime,
                LocalDateTime futureDateTime, List<String> selectedUnitsFromSettings) {
        
            //to store the dates
            Date currentTime = currentDateTime.toDateTime().toDate();
            Date futureTime = futureDateTime.toDateTime().toDate();
        
            //to store the units
            String currentUnit = "";
            String prevUnit = "";
        
            //to store the value which you want to remove
            int prevValue = 0;
        
            //to store the calculated values in hashmap
            HashMap units = new HashMap();
        
            for(int i = 0; i < selectedUnitsFromSettings.size(); i++){
                //to store the current unit for calculation of future date
                currentUnit = selectedUnitsFromSettings.get(i);
                //to remove higher unit from new future date we will use prevUnit
                if(i > 0){
                    prevUnit = selectedUnitsFromSettings.get(i-1);
                    futureTime = getDateForPreviousUnit(futureTime,prevUnit,prevValue);
                }
        
                //now calculate the difference
                    if(currentUnit.equals("Year")){
                    Years q = Years.yearsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int years = q.getYears();
                    prevValue = years;
                    units.put("Year", prevValue);
                }else if(currentUnit.equals("Month")){
                    Months w =  Months.monthsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int months = w.getMonths();
                    prevValue = months;
                    units.put("Month", prevValue);
                }else if(currentUnit.equals("Week")){
                    Weeks e = Weeks.weeksBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int weeks = e.getWeeks();
                    prevValue = weeks;
                    units.put("Week", prevValue);
                }else if(currentUnit.equals("Day")){
                    Days r = Days.daysBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int days = r.getDays();
                    prevValue = days;
                    units.put("Day", prevValue);
                }else if(currentUnit.equals("Hour")){
                    Hours a = Hours.hoursBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int hours = a.getHours();
                    prevValue = hours;
                    units.put("Hour", prevValue);
                }else if(currentUnit.equals("Minute")){
                    Minutes s = Minutes.minutesBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int minutes = s.getMinutes();
                    prevValue = minutes;
                    units.put("Minute", prevValue);
                }else if(currentUnit.equals("Second")){
                    Seconds d = Seconds.secondsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
                    int seconds = d.getSeconds();
                    prevValue = seconds;
                    units.put("Second", prevValue);
                }
        
            }
        
            return units;
        }
        

        计算上一个单元的未来时间

        /**
         * 
         * @param futureTime the future date which will be modified
         * @param prevString which unit value to be reduced
         * @param prevValue how much to reduce from the current unit
         * @return
         */
        private static Date getDateForPreviousUnit(Date futureTime,
                String prevString, int prevValue) {
        
            Date calculatedDate = futureTime;
            Constants.showLog(TAG, "prev string is "+prevString);
        
            if(prevString.equals("Year")){
                calculatedDate = new DateTime(futureTime).minusYears(prevValue).toDate();
            }else if(prevString.equals("Month")){
                calculatedDate = new DateTime(futureTime).minusMonths(prevValue).toDate();
            }else if(prevString.equals("Week")){
                calculatedDate = new DateTime(futureTime).minusWeeks(prevValue).toDate();
            }else if(prevString.equals("Day")){
                calculatedDate = new DateTime(futureTime).minusDays(prevValue).toDate();
            }else if(prevString.equals("Hour")){
                calculatedDate = new DateTime(futureTime).minusHours(prevValue).toDate();
            }else if(prevString.equals("Minute")){
                calculatedDate = new DateTime(futureTime).minusMinutes(prevValue).toDate();
            }else if(prevString.equals("Second")){
                calculatedDate = new DateTime(futureTime).minusSeconds(prevValue).toDate();
            }
        
            return calculatedDate;
        }
        
      4. 现在从任何活动调用使用这个

        HashTable hashTable = dateBasedOnUnitCalculator(this, currentDateTime, futureDateTime, selectedUnitsFromSettings);
        
                       //to display the values from hashtable
            showLog(TAG,
                    " year "+hashTable.get("Year") +
                    " month "+hashTable.get("Month") +
                    " week "+hashTable.get("Week") +
                    " day "+hashTable.get("Day") + 
                    " hours "+hashTable.get("Hour") + 
                    " min " +hashTable.get("Minute") +
                    " sec " +hashTable.get("Second") + 
                    " ");
        
      5. selectedunitsfromsettings 将包含您想要的任何单位。

      【讨论】:

        【解决方案5】:

        您可以找到两个日期之间的差异无需使用任何库

        您只需要像这样找出日期之间的差异:

            long diff = currentdate.getTime() - temp_date.getTime();
                            //current date            //other date
        

        通过这个你会得到毫秒的差异.. 现在你可以根据你的需要来格式化它,即几小时前或几个月前或几年前格式,只需使用 if 条件

        查看完整示例HERE..

        希望对您有所帮助..!

        【讨论】:

        • 哦,它对我的​​帮助太棒了.. 在没有库 osm 的情况下获取日期
        【解决方案6】:

        你得到 1970 的原因是因为它是以毫秒为单位的纪元日期。要获得实际差异,请使用以下内容。

        使用JodaTime

        【讨论】:

        • Joda time 是一个 500kb+ 的库,可能不适合 Android 应用。
        • @Jonny:你还有其他合适的选择吗?
        • 是的,实际上 Lawrence Barsanti 下面的回答更适合使用 Android Time 类的 Android。它以 OP 要求的格式提供一个字符串。
        猜你喜欢
        • 2020-03-22
        • 2017-03-27
        • 2014-02-12
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        相关资源
        最近更新 更多