2010-10-11 27 views
6

için SQLite tarihini dönüştürmek:Java (Android) "x gün önce" Ben var

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

O dizeyi ayrıştırmak istiyorum, sonra Geçerli tarihten bu tarih/saat çıkarma/zaman ben çıkış can böylece "2 gün önce" benzer bir dize.

cevap

1

Tarihe dönüştürün. Geçerli tarih saatini al. Farkı kirlet.

+0

Evet, bu tam olarak yapmak istediğim şey bu. Şimdi birisi bana nasıl yapılacağını gösterecek kadar nazik olabilir. – Paul

2

Bunu yapmak için daha iyi bir yol olabilir, ancak bu çalışır.

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

Bu, kullanıyorum, Android'in standart DateUtils'i genişleten bir yardımcı sınıftır. Günümüzün zaman damgaları için saniyeyi veya dakikayı ya da saati gösterirken, diğer zaman damgaları için tarihi görüntüleyebilecek gelişmiş bir mantığı vardır.

Mantığı, gereksinimlerinize göre getTimeDiffString yönteminde ayarlayabilirsiniz. Parametre olarak, yukarıdaki kodda getirdiğiniz Date date = formatter.parse(dateString); zaman damgasını ayrıştırırsınız.

Kod mantığı, Facebook veya Twitter'dan bildiğiniz gibi 'zaman damgası ekranı' ile uyumludur. strings.xml tutarken

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

} 

:

<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

İçe aktarma java.text.DateFormatSymbols; import java.util.Calendar; import android.content.Context; import android.text.format.DateUtils; ve sınıfınızda iki değişken belirtin: özel statik İçerik mCtx; özel statik DateTimeUtils örneği; – happyhardik

4

bu deneyin:

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