我的字符串发布日期如下:
2011-03-27T09:39:01.607
并且有当前日期。
我希望以下列形式区分这两个日期:
2 days ago
1 minute ago etc..
取决于发布日期。
使用此代码将发布日期转换为毫秒:
public long Date_to_MilliSeconds(int day, int month, int year, int hour, int minute) {
Calendar c = Calendar.getInstance();
c.set(year, month, day, hour, minute, 00);
return c.getTimeInMillis();
}
此当前日期:long now = System.currentTimeMillis();
并计算差异:
String difference = (String) DateUtils.getRelativeTimeSpanString(time,now, 0);
但它会像May 1 , 1970
或其他东西一样返回。
如何区分过帐日期和当前日期。
答案 0 :(得分:21)
您可以使用getRelativeTimeSpanString()。它返回一个像“1分钟前”的字符串。这是一个真实的简单示例,它说明了应用程序运行了多长时间。
private long mStartTime;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mStartTime = System.currentTimeMillis();
}
public void handleHowLongClick(View v) {
CharSequence cs = DateUtils.getRelativeTimeSpanString(mStartTime);
Toast.makeText(this, cs, Toast.LENGTH_LONG).show();
}
答案 1 :(得分:7)
将两个日期转换为日历并将时间设为0(
today.set(Calendar.HOUR_OF_DAY, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
)。
然后使用这个乐趣:
public final static long SECOND_MILLIS = 1000;
public final static long MINUTE_MILLIS = SECOND_MILLIS*60;
public final static long HOUR_MILLIS = MINUTE_MILLIS*60;
public final static long DAY_MILLIS = HOUR_MILLIS*24;
public static int daysDiff( Date earlierDate, Date laterDate )
{
if( earlierDate == null || laterDate == null ) return 0;
return (int)((laterDate.getTime()/DAY_MILLIS) - (earlierDate.getTime()/DAY_MILLIS));
}
答案 2 :(得分:4)
尝试我在其中一个应用程序中使用的以下方法:
/**
* Returns difference between time and current time as string like:
* "23 mins ago" relative to current time.
* @param time - The time to compare with current time in yyyy-MM-dd HH:mm:ss format
* @param currentTime - Present time in yyyy-MM-dd HH:mm:ss format
* @return String - The time difference as relative text(e.g. 23 mins ago)
* @throws ParseException
*/
private String getTimeDiff(String time, String currentTime) throws ParseException
{
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date currentDate = (Date)formatter.parse(currentTime);
Date oldDate = (Date)formatter.parse(time);
long oldMillis = oldDate.getTime();
long currentMillis = currentDate.getTime();
return DateUtils.getRelativeTimeSpanString(oldMillis, currentMillis, 0).toString();
}
答案 3 :(得分:2)
实现这个的简单方法:
导入项目中的joda库。
将您当前的日期和未来日期存储在此变量中
//here currenDate and futureDate are of calendar type.
LocalDateTime currentDateTime = LocalDateTime.fromCalendarFields(currentDate);
LocalDateTime futureDateTime = LocalDateTime.fromCalendarFields(futureDate);
现在您需要做的是计算两个日期之间的差异并保存差异,这个差异将用于从下一个字段中减去。
例如:我们必须显示年,月,周......等等。在计算两个日期之间的年份之后,我们将减去月份的年份数量,并且类似地用于下一个字段...日期时间的层次结构如下...
年 - 月 - 周 - 日 - 小时 - 分 - 秒
现在是片段
/**
*
* @param context which activity its calling
* @param currentDateTime current time
* @param futureDateTime future time from which we have to calculate difference
* @param selectedUnitsFromSettings which units we have to find difference such as years,weeks....etc
* which will be stored in list...
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static HashMap dateBasedOnUnitCalculator(
Context ctx, LocalDateTime currentDateTime,
LocalDateTime futureDateTime, List<String> selectedUnitsFromSettings) {
//to store the dates
Date currentTime = currentDateTime.toDateTime().toDate();
Date futureTime = futureDateTime.toDateTime().toDate();
//to store the units
String currentUnit = "";
String prevUnit = "";
//to store the value which you want to remove
int prevValue = 0;
//to store the calculated values in hashmap
HashMap units = new HashMap();
for(int i = 0; i < selectedUnitsFromSettings.size(); i++){
//to store the current unit for calculation of future date
currentUnit = selectedUnitsFromSettings.get(i);
//to remove higher unit from new future date we will use prevUnit
if(i > 0){
prevUnit = selectedUnitsFromSettings.get(i-1);
futureTime = getDateForPreviousUnit(futureTime,prevUnit,prevValue);
}
//now calculate the difference
if(currentUnit.equals("Year")){
Years q = Years.yearsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int years = q.getYears();
prevValue = years;
units.put("Year", prevValue);
}else if(currentUnit.equals("Month")){
Months w = Months.monthsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int months = w.getMonths();
prevValue = months;
units.put("Month", prevValue);
}else if(currentUnit.equals("Week")){
Weeks e = Weeks.weeksBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int weeks = e.getWeeks();
prevValue = weeks;
units.put("Week", prevValue);
}else if(currentUnit.equals("Day")){
Days r = Days.daysBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int days = r.getDays();
prevValue = days;
units.put("Day", prevValue);
}else if(currentUnit.equals("Hour")){
Hours a = Hours.hoursBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int hours = a.getHours();
prevValue = hours;
units.put("Hour", prevValue);
}else if(currentUnit.equals("Minute")){
Minutes s = Minutes.minutesBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int minutes = s.getMinutes();
prevValue = minutes;
units.put("Minute", prevValue);
}else if(currentUnit.equals("Second")){
Seconds d = Seconds.secondsBetween(new DateTime(currentTime.getTime()), new DateTime(futureTime.getTime()));
int seconds = d.getSeconds();
prevValue = seconds;
units.put("Second", prevValue);
}
}
return units;
}
计算前一单位的未来时间
/**
*
* @param futureTime the future date which will be modified
* @param prevString which unit value to be reduced
* @param prevValue how much to reduce from the current unit
* @return
*/
private static Date getDateForPreviousUnit(Date futureTime,
String prevString, int prevValue) {
Date calculatedDate = futureTime;
Constants.showLog(TAG, "prev string is "+prevString);
if(prevString.equals("Year")){
calculatedDate = new DateTime(futureTime).minusYears(prevValue).toDate();
}else if(prevString.equals("Month")){
calculatedDate = new DateTime(futureTime).minusMonths(prevValue).toDate();
}else if(prevString.equals("Week")){
calculatedDate = new DateTime(futureTime).minusWeeks(prevValue).toDate();
}else if(prevString.equals("Day")){
calculatedDate = new DateTime(futureTime).minusDays(prevValue).toDate();
}else if(prevString.equals("Hour")){
calculatedDate = new DateTime(futureTime).minusHours(prevValue).toDate();
}else if(prevString.equals("Minute")){
calculatedDate = new DateTime(futureTime).minusMinutes(prevValue).toDate();
}else if(prevString.equals("Second")){
calculatedDate = new DateTime(futureTime).minusSeconds(prevValue).toDate();
}
return calculatedDate;
}
现在要从任何活动中调用
HashTable hashTable = dateBasedOnUnitCalculator(this, currentDateTime, futureDateTime, selectedUnitsFromSettings);
//to display the values from hashtable
showLog(TAG,
" year "+hashTable.get("Year") +
" month "+hashTable.get("Month") +
" week "+hashTable.get("Week") +
" day "+hashTable.get("Day") +
" hours "+hashTable.get("Hour") +
" min " +hashTable.get("Minute") +
" sec " +hashTable.get("Second") +
" ");
selectedunitsfromsettings将包含您想要的任何单位。
答案 4 :(得分:1)
您可以找到两个日期之间的差异,而不使用任何库
你只需找出这样的日期之间的区别:
long diff = currentdate.getTime() - temp_date.getTime();
//current date //other date
通过这个你会得到毫秒差异.. 现在你可以根据你的需要格式化,例如小时前或几个月前或几年前格式,只需使用if条件
请参阅完整示例HERE ..
希望它有帮助..!
答案 5 :(得分:0)
你得到1970年的原因是因为它是以毫秒为单位的纪元日期。要获得实际差异,请使用以下内容。
使用JodaTime