Am having string posting date like :
2011-03-27T09:39:01.607
and There is current date .
I want to get difference between these tw
The reason you get 1970 is because it is the epoch date in milli seconds. To get the actual difference use the below.
Use JodaTime
Simple way to implement this:
import joda library in your project.
store your current date and future date in variable like this
//here currenDate and futureDate are of calendar type.
LocalDateTime currentDateTime = LocalDateTime.fromCalendarFields(currentDate);
LocalDateTime futureDateTime = LocalDateTime.fromCalendarFields(futureDate);
Now what you have to do is calculate difference between the two dates and save the difference,this difference will be used to subtract from next field.
for example: we have to display years,months,weeks...and so forth. after calculating years between the two dates we will minus the years amount from the months and similarly for the next fields...Hierarchy of the date time is as follows...
years-months-weeks-days-hours-minutes-seconds
now the snippet
/**
*
* @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;
}
to calculate future time for previous unit
/**
*
* @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;
}
now to call from any activity use this
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") +
" ");
selectedunitsfromsettings will have any units you desire.
You can use getRelativeTimeSpanString(). It returns a string like "1 minute ago". Here is a real simple example that tells how long the application has been running.
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();
}
Try the following method that I used in one of my applications:
/**
* 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();
}
You can find difference between two dates without using any library
You just need to find out difference between dates like this :
long diff = currentdate.getTime() - temp_date.getTime();
//current date //other date
by this you will get difference in milliseconds .. Now you can format this according to your need i.e in hours ago or months ago or years ago format,just by using if conditions
See complete example HERE..
Hope it helps..!
Convert both dates into calender and make time 0(
today.set(Calendar.HOUR_OF_DAY, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
).
Then use this fun :
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));
}