【问题标题】:Java(Android) convert SQLite date to "x days ago"Java(Android) 将 SQLite 日期转换为“x 天前”
【发布时间】:2011-04-24 00:40:22
【问题描述】:

我有:

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

我想解析那个字符串,然后从当前日期/时间中减去那个日期/时间,这样我就可以输出一个类似于“2天前”的字符串。

【问题讨论】:

    标签: java android date format


    【解决方案1】:

    这是我正在使用的辅助类,它扩展了 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>
    

    【讨论】:

    • 你必须导入 import java.text.DateFormatSymbols;导入 java.util.Calendar;导入android.content.Context;导入 android.text.format.DateUtils;并在你的类中声明两个变量:private static Context mCtx;私有静态 DateTimeUtils 实例;
    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      可能有更好的方法来做到这一点,但这是可行的。

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

      【讨论】:

        【解决方案4】:

        将其转换为日期。获取当前日期时间。计算差异。

        【讨论】:

        • 是的,这正是我想要做的。现在,如果有人可能会告诉我如何做到这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2013-09-22
        相关资源
        最近更新 更多