2017-07-03 61 views
1

我想得到兩個日期之間的年份差異。其中一個日期是當前日期和時間。另一個是用戶的出生日期。不能得到兩個日期之間的年份

我能得到用戶的出生日期正確,這樣的:1995-06-18T19:36:00.000Z

我得到這個錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

這裏是我的功能:

public int calculateAge(String comingDate) 
{ 
    long userAge = 0; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
    sdf.setTimeZone(TimeZone.getTimeZone("GMT+03:00")); 
    Calendar cal = Calendar.getInstance(); 
    try 
    { 
     Date date1 = sdf.parse(sdf.format(cal.getTime())); 
     Date date2 = sdf.parse(comingDate); 
     userAge = (date2.getTime() - date1.getTime())/86400000; 

    } 
    catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

    return (int)userAge; 
} 
+0

NullPointerException發生在哪一行? – 2017-07-03 18:24:50

+0

日期date2 = sdf.parse(comingDate); –

+0

那麼可能'comingDate'爲null,你檢查過了嗎? – 2017-07-03 18:30:49

回答

2

首先,你不必這樣做:

Date date1 = sdf.parse(sdf.format(cal.getTime())); 

只要做到:

Date date1 = cal.getTime(); 

並計算時代,把date1date2之前,否則,你將有負值:

userAge = (date1.getTime() - date2.getTime())/86400000; 

使用comingDate1995-06-18T19:36:00.000Z,我得到結果8050(相當於22年),所以它似乎是正確的。

如果你想在代替日齡:

userAge = (date1.getTime() - date2.getTime())/86400000/365; 

結果將是22


新的Java日期/時間API

如果你確定有關將依賴於你的Android項目,你可以使用ThreeTen Backport,對Java 8的新的日期/時間類大反向移植,一起與ThreeTenABP(更多關於如何使用它here)。

所有類都在org.threeten.bp包中。該代碼是簡單得多

import org.threeten.bp.temporal.ChronoUnit; 
import org.threeten.bp.Instant; 
import org.threeten.bp.ZonedDateTime; 

String comingDate = "1995-06-18T19:36:00.000Z"; 
// get the number of days between comingDate and current date (result is 8050) 
int userAge = (int) ChronoUnit.DAYS.between(Instant.parse(comingDate), Instant.now()); // 8050 
// get the age in years (result is 22) 
userAge = (int) ChronoUnit.YEARS.between(ZonedDateTime.parse(comingDate), ZonedDateTime.now()); // 22 

爲了讓年齡在幾年我不得不使用ZonedDateTime,因爲一些單位不與Instant工作。

+0

等待如何從8050中獲得22?我的意思是如何從這部分中刪除部分:24 * 60 * 60 * 1000? –

+0

你想要幾天或幾年的年齡? – 2017-07-03 18:40:45

+0

其實都是:D –

0

這將幫助你

public String get_count_of_days(String Created_date_String, String 
    Expire_date_String) 

{ 
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", 
Locale.getDefault()); 

Date Created_convertedDate = null, Expire_CovertedDate = null, todayWithZeroTime = null; 
try { 
    Created_convertedDate = dateFormat.parse(Created_date_String); 
    Expire_CovertedDate = dateFormat.parse(Expire_date_String); 

    Date today = new Date(); 

    todayWithZeroTime = dateFormat.parse(dateFormat.format(today)); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

int c_year = 0, c_month = 0, c_day = 0; 

if (Created_convertedDate.after(todayWithZeroTime)) { 
    Calendar c_cal = Calendar.getInstance(); 
    c_cal.setTime(Created_convertedDate); 
    c_year = c_cal.get(Calendar.YEAR); 
    c_month = c_cal.get(Calendar.MONTH); 
    c_day = c_cal.get(Calendar.DAY_OF_MONTH); 

} else { 
    Calendar c_cal = Calendar.getInstance(); 
    c_cal.setTime(todayWithZeroTime); 
    c_year = c_cal.get(Calendar.YEAR); 
    c_month = c_cal.get(Calendar.MONTH); 
    c_day = c_cal.get(Calendar.DAY_OF_MONTH); 
} 


/*Calendar today_cal = Calendar.getInstance(); 
int today_year = today_cal.get(Calendar.YEAR); 
int today = today_cal.get(Calendar.MONTH); 
int today_day = today_cal.get(Calendar.DAY_OF_MONTH); 
*/ 

Calendar e_cal = Calendar.getInstance(); 
e_cal.setTime(Expire_CovertedDate); 

int e_year = e_cal.get(Calendar.YEAR); 
int e_month = e_cal.get(Calendar.MONTH); 
int e_day = e_cal.get(Calendar.DAY_OF_MONTH); 

Calendar date1 = Calendar.getInstance(); 
Calendar date2 = Calendar.getInstance(); 

date1.clear(); 
date1.set(c_year, c_month, c_day); 
date2.clear(); 
date2.set(e_year, e_month, e_day); 

long diff = date2.getTimeInMillis() - date1.getTimeInMillis(); 

float dayCount = (float) diff/(24 * 60 * 60 * 1000); 

return ("" + (int) dayCount + " Days"); 
} 
+0

請始終包含關於您的代碼的描述,以及它將如何提供幫助,因爲代碼轉儲通常很難理解 –

+0

先生,不要誤解我的意思,但大衛說得對。你的代碼很難理解。 –

1

很簡單:

int daysDifference = (date2.getTime() - date1.getTime())/(24 * 60 * 60 * 1000); 

Date.getTime()得到以毫秒爲單位的時間,因爲「1970年1月1日」,那麼我們需要在一天內毫秒來劃分。 (); new Date()。getTime();}這樣你就不需要一個日曆來獲得實際的時間,新的Date().getTime();返回它

int daysPassedSinceADate = (new Date().getTime() - date.getTime())/(24 * 60 * 60 * 1000); 

如果您的應用程序使用如此多的日期或時間不要將其保存爲字符串,請將其保存爲長句,簡單得多。

+0

先生,我寫了和你一樣的代碼。你已經忘了cast int了。 –

+0

我在回答中添加了一些東西 –

0
public long getDifferenceBetweenDates(Date dateOfBirth, Date currentDate) { 
    long difference = currentDate.getTime() - dateOfBirth.getTime(); 
    long daysInMilliseconds = 60 * 60 * 24 * 1000; 
    long elapsedDays = difference/daysInMilliseconds; 
    return elapsedDays; 
} 
相關問題