2010-10-11 69 views

回答

1

將其轉換爲日期。獲取當前日期時間。計算差異。

+0

是的,這正是我想做的事情。現在,如果有人可能會友善地告訴我如何去做。 – Paul 2010-10-11 21:50:29

2

可能有更好的方法來做到這一點,但這是有效的。

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

這是我使用的助手類,它擴展了Android的標準DateUtils。它具有先進的邏輯,對於今天的時間戳,它將顯示秒或分鐘或小時,而對於其他時間戳,它將顯示日期。

您可以在getTimeDiffString方法中根據您的需要調整邏輯。作爲參數,您將解析您在上面的代碼中獲取的Date date = formatter.parse(dateString);的時間戳。

代碼邏輯符合您從Facebook或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); 
     } 
    } 

} 

而strings.xml中認爲:

<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> 
+0

你將不得不導入import java.text.DateFormatSymbols; import java.util.Calendar; import android.content.Context; import android.text.format.DateUtils;並在你的類中聲明兩個變量:private static Context mCtx;私人靜態DateTimeUtils實例; – happyhardik 2012-09-03 11:56:53

4

試試這個:

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