在Android的两个日期之间获得差异

时间:2011-08-01 10:19:06

标签: java android date

我的字符串发布日期如下:

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或其他东西一样返回。

如何区分过帐日期和当前日期。

6 个答案:

答案 0 :(得分:21)

您可以使用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 :(得分:7)

将两个日期转换为日历并将时间设为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));
    }

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

实现这个的简单方法:

  1. 导入项目中的joda库。

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

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

    例如:我们必须显示年,月,周......等等。在计算两个日期之间的年份之后,我们将减去月份的年份数量,并且类似地用于下一个字段...日期时间的层次结构如下...

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

    现在是片段

    /**
     * 
     * @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将包含您想要的任何单位。

答案 4 :(得分:1)

您可以找到两个日期之间的差异,而不使用任何库

你只需找出这样的日期之间的区别:

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

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

请参阅完整示例HERE ..

希望它有帮助..!

答案 5 :(得分:0)

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

使用JodaTime