Java(Android) 将 SQLite 日期转换为“x 天前”

发布于 2024-09-27 04:34:02 字数 131 浏览 5 评论 0原文

我有:

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

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

I have:

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

I want to parse that string, then subtract that date/time from the current date/time so that I can output a string similar to "2 days ago".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

傲鸠 2024-10-04 04:34:02

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

This is a helper class I'm using, extending the standard DateUtils of Android. It has an advanced logic, that for timestamps of today, it would display the seconds or minutes or hours, while for other timestamps it would display the date.

You can adjust the logic to your needs in the getTimeDiffString method. As parameter, you would parse the timestamp of Date date = formatter.parse(dateString); that you're fetching in above code.

The code logic complies with the 'timestamp display' as you know it 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 holds:

<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>
稍尽春風 2024-10-04 04:34:02

试试这个:

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

Try this:

    long currentTimeMillis = System.currentTimeMillis();
    CharSequence string = DateUtils.getRelativeTimeSpanString(currentTimeMillis, currentTimeMillis + DateUtils.MINUTE_IN_MILLIS * 5, 0, DateUtils.FORMAT_ABBREV_ALL);
尐偏执 2024-10-04 04:34:02

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

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

There may be a better way to do this, but this 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-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());
}   
时光礼记 2024-10-04 04:34:02

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文