Java (Android) converts SQLite date to "x days ago"

I have:

String date = "2010-10-9 12:00:00"; 

I want to parse this string and then subtract this date / time from the current date / time so that I can output a string similar to “2 days ago”.

+6
java android date format
source share
4 answers

This is a helper class that I use when distributing standard DateUtils for Android. It has advanced logic that for today's time slots it displays seconds or minutes or hours, while for other timestamps it will display a date.

You can customize the logic to suit your needs in the getTimeDiffString method. As a parameter, you should Date date = formatter.parse(dateString); timestamp Date date = formatter.parse(dateString); which you retrieve in the above code.

The logic of the code corresponds to the value of "timestamp", as you know, from Facebook or Twitter.

 public class DateTimeUtils extends DateUtils { private static String mTimestampLabelYesterday; private static String mTimestampLabelToday; private static String mTimestampLabelJustNow; private static String mTimestampLabelMinutesAgo; private static String mTimestampLabelHoursAgo; private static String mTimestampLabelHourAgo; /** * Singleton contructor, needed to get access to the application context & strings for i18n * @param context Context * @return DateTimeUtils singleton instanec * @throws Exception */ public static DateTimeUtils getInstance(Context context) { mCtx = context; if (instance == null) { instance = new DateTimeUtils(); mTimestampLabelYesterday = context.getResources().getString(R.string.WidgetProvider_timestamp_yesterday); mTimestampLabelToday = context.getResources().getString(R.string.WidgetProvider_timestamp_today); mTimestampLabelJustNow = context.getResources().getString(R.string.WidgetProvider_timestamp_just_now); mTimestampLabelMinutesAgo = context.getResources().getString(R.string.WidgetProvider_timestamp_minutes_ago); mTimestampLabelHoursAgo = context.getResources().getString(R.string.WidgetProvider_timestamp_hours_ago); mTimestampLabelHourAgo = context.getResources().getString(R.string.WidgetProvider_timestamp_hour_ago); } return instance; } /** * Checks if the given date is yesterday. * * @param date - Date to check. * @return TRUE if the date is yesterday, FALSE otherwise. */ public static boolean isYesterday(long date) { final Calendar currentDate = Calendar.getInstance(); currentDate.setTimeInMillis(date); final Calendar yesterdayDate = Calendar.getInstance(); yesterdayDate.add(Calendar.DATE, -1); return yesterdayDate.get(Calendar.YEAR) == currentDate.get(Calendar.YEAR) && yesterdayDate.get(Calendar.DAY_OF_YEAR) == currentDate.get(Calendar.DAY_OF_YEAR); } public static String[] weekdays = new DateFormatSymbols().getWeekdays(); // get day names public static final long millisInADay = 1000 * 60 * 60 * 24; ... /** * Displays a user-friendly date difference string * @param timedate Timestamp to format as date difference from now * @return Friendly-formatted date diff string */ public String getTimeDiffString(long timedate) { Calendar startDateTime = Calendar.getInstance(); Calendar endDateTime = Calendar.getInstance(); endDateTime.setTimeInMillis(timedate); long milliseconds1 = startDateTime.getTimeInMillis(); long milliseconds2 = endDateTime.getTimeInMillis(); long diff = milliseconds1 - milliseconds2; long hours = diff / (60 * 60 * 1000); long minutes = diff / (60 * 1000); minutes = minutes - 60 * hours; long seconds = diff / (1000); boolean isToday = DateTimeUtils.isToday(timedate); boolean isYesterday = DateTimeUtils.isYesterday(timedate); if (hours > 0 && hours < 12) { return hours==1? String.format(mTimestampLabelHourAgo,hours) : String.format(mTimestampLabelHoursAgo,hours); } else if (hours <= 0) { if (minutes > 0) return String.format(mTimestampLabelMinutesAgo,minutes); else { return mTimestampLabelJustNow; } } else if (isToday) { return mTimestampLabelToday; } else if (isYesterday) { return mTimestampLabelYesterday; } else if (startDateTime.getTimeInMillis() - timedate < millisInADay * 6) { return weekdays[endDateTime.get(Calendar.DAY_OF_WEEK)]; } else { return formatDateTime(mCtx, timedate, DateUtils.FORMAT_NUMERIC_DATE); } } } 

while strings.xml contains:

 <string name="WidgetProvider_timestamp_today">Today</string> <string name="WidgetProvider_timestamp_yesterday">Yesterday</string> <string name="WidgetProvider_timestamp_hour_ago">%s hour ago</string> <string name="WidgetProvider_timestamp_hours_ago">%s hours ago</string> <string name="WidgetProvider_timestamp_minutes_ago">%s minutes ago</string> <string name="WidgetProvider_timestamp_just_now">Just now</string> 
+18
source share

Try the following:

  long currentTimeMillis = System.currentTimeMillis(); CharSequence string = DateUtils.getRelativeTimeSpanString(currentTimeMillis, currentTimeMillis + DateUtils.MINUTE_IN_MILLIS * 5, 0, DateUtils.FORMAT_ABBREV_ALL); 
+4
source share

There may be a better way to do this, but it works.

 String dateString = "2010-10-9 12:00:00"; String daysAgo = null; // How many milliseconds in 1 day final long DAY_IN_MILLIS = 86400000; // The current timestamp in milliseconds long now = System.currentTimeMillis(); // The format of your date string assuming the 1 am would read 01:00, not 1:00 // and Jan 1, 2010 would read 2010-1-1, not 2010-01-01 final DateFormat formatter = new SimpleDateFormat("yyyy-Md hh:mm:ss"); // The calendar instance which adds a locale to the date final Calendar cal = Calendar.getInstance(); try { // Parse the date string to return a Date object Date date = formatter.parse(dateString); // Set the calendar with our date object cal.setTime(date); // Get the millis timestamp of your date string long then = cal.getTimeInMillis(); // Calculate the difference long difference = now - then; int ago = 0; // If the difference is greater than one day if (difference >= DAY_IN_MILLIS) { // Find the product ago = (int) (difference / DAY_IN_MILLIS); // Format your new string // You may want to check if(ago>1) here daysAgo = String.format("%d day(s) ago", ago); } // Write the result to Logcat Log.d(TAG, daysAgo); } catch (ParseException e) { Log.e(TAG, e.getLocalizedMessage()); } 
+2
source share

Convert it to date. Get the current time. Calculate the difference.

+1
source share

All Articles