tôi có:Java (Android) chuyển đổi ngày SQLite để "x days ago"
String date = "2010-10-9 12:00:00";
Tôi muốn phân tích chuỗi, sau đó trừ đi ngày/giờ từ ngày hiện tại/thời gian để tôi có thể sản lượng một chuỗi tương tự như "2 ngày trước".
tôi có:Java (Android) chuyển đổi ngày SQLite để "x days ago"
String date = "2010-10-9 12:00:00";
Tôi muốn phân tích chuỗi, sau đó trừ đi ngày/giờ từ ngày hiện tại/thời gian để tôi có thể sản lượng một chuỗi tương tự như "2 ngày trước".
Chuyển đổi từ đầu cho đến ngày. Nhận ngày giờ hiện tại. Calc sự khác biệt.
Có thể có cách tốt hơn để thực hiện việc này, nhưng cách này hoạt động.
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());
}
Đây là lớp trợ giúp tôi đang sử dụng, mở rộng DateUtils chuẩn của Android. Nó có một logic nâng cao, cho timestamps của ngày hôm nay, nó sẽ hiển thị giây hoặc phút hoặc giờ, trong khi đối với các dấu thời gian khác nó sẽ hiển thị ngày tháng.
Bạn có thể điều chỉnh logic theo nhu cầu của mình theo phương pháp getTimeDiffString
. Là tham số, bạn sẽ phân tích cú pháp dấu thời gian của Date date = formatter.parse(dateString);
mà bạn đang tìm nạp ở mã trên.
Logic mã tuân thủ 'hiển thị dấu thời gian' như bạn biết từ Facebook hoặc 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);
}
}
}
khi strings.xml giữ:
<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>
Bạn sẽ phải nhập khẩu java.text.DateFormatSymbols; nhập khẩu java.util.Calendar; nhập android.content.Context; nhập android.text.format.DateUtils; và khai báo hai biến trong lớp của bạn: Ngữ cảnh tĩnh riêng mCtx; trường hợp DateTimeUtils tĩnh riêng; – happyhardik
Hãy thử điều này:
long currentTimeMillis = System.currentTimeMillis();
CharSequence string = DateUtils.getRelativeTimeSpanString(currentTimeMillis, currentTimeMillis + DateUtils.MINUTE_IN_MILLIS * 5, 0, DateUtils.FORMAT_ABBREV_ALL);
Yep, đó chính xác là những gì tôi muốn làm. Bây giờ nếu ai đó có thể tử tế, đủ để chỉ cho tôi cách làm điều đó. – Paul