Getting the difference between two Android dates

I have a publication date for a string, for example:

2011-03-27T09:39:01.607 

and there is the current date.

I want to get the difference between these two dates in the form:

 2 days ago 1 minute ago etc.. 

depending on the posting date.

Use this code to convert posting dates to milliseconds:

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

current date: long now = System.currentTimeMillis();

and calculate the difference:

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

But he comes back like May 1 , 1970 or something ..

How to get the difference between the posting date and the current date.

+6
source share
6 answers

The reason you get 1970 is the date of the era in milliseconds. To get the real difference, use below.

Use JodaTime

0
source

You can use getRelativeTimeSpanString () . It returns a string like "1 minute ago." Here is a simple example that shows 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(); } 
+21
source

Convert both dates to calendar and make time 0 (

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

)
Then use this pleasure:

 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)); } 
+7
source

Try using 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(eg 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
source

A simple way to implement this:

  • import joda library into your project.

  • save the current date and future date in a variable like this

     //here currenDate and futureDate are of calendar type. LocalDateTime currentDateTime = LocalDateTime.fromCalendarFields(currentDate); LocalDateTime futureDateTime = LocalDateTime.fromCalendarFields(futureDate); 
  • Now you need to calculate the difference between the two dates and save the difference, this difference will be used to subtract from the next field.

    for example: we should show years, months, weeks ... and so on. after calculating the years between two dates, we will minus the number of years from the month and similarly for the following fields ... The hierarchy of the time date is as follows:

    years-months-weeks-days-hours-minutes-seconds

    now fragment

     /** * * @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 the future time for the previous block

     /** * * @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 wish.

+2
source

You can find the difference between two dates without using any library

You just need to find out the difference between dates like:

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

this will give you the difference in milliseconds .. Now you can format it according to your needs ie in the format of hours ago or months ago or years ago , simply using the conditions

See the full example HERE ..

Hope this helps ..!

+1
source

Source: https://habr.com/ru/post/894019/


All Articles