package open.dolphin.util;
import java.util.Calendar;
import java.util.GregorianCalendar;
import open.dolphin.client.ClientContext;
/**
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class AgeCalculater {
public static String getAgeAndBirthday(String mmlBirthday, int monthAge) {
int[] spec = getAgeSpec(mmlBirthday);
if (spec[0] != -1 && spec[1] != -1) {
StringBuilder sb = new StringBuilder();
sb.append(spec[0]);
if (spec[0] < monthAge && spec[1] != 0) {
sb.append(".").append(spec[1]);
}
sb.append(" ").append(ClientContext.getBundle().getString("yearsOld"));
sb.append(" (").append(mmlBirthday).append(")");
return sb.toString();
}
return null;
}
public static String getAge(String mmlBirthday, int monthAge) {
int[] spec = getAgeSpec(mmlBirthday);
if (spec[0] != -1 && spec[1] != -1) {
StringBuilder sb = new StringBuilder();
sb.append(spec[0]);
if (spec[0] < monthAge && spec[1] != 0) {
sb.append(".").append(spec[1]);
}
return sb.toString();
}
return null;
}
public static int[] getAgeSpec(String mmlBirthday) {
try {
GregorianCalendar gc1 = getCalendar(mmlBirthday);
GregorianCalendar gc2 = new GregorianCalendar(); // Today
int years = 0;
int month = 0;
int days = 0;
gc1.clear(Calendar.MILLISECOND);
gc1.clear(Calendar.SECOND);
gc1.clear(Calendar.MINUTE);
gc1.clear(Calendar.HOUR_OF_DAY);
gc2.clear(Calendar.MILLISECOND);
gc2.clear(Calendar.SECOND);
gc2.clear(Calendar.MINUTE);
gc2.clear(Calendar.HOUR_OF_DAY);
while (gc1.before(gc2)) {
gc1.add(Calendar.YEAR, 1);
years++;
}
gc1.add(Calendar.YEAR, -1);
years--;
while (gc1.before(gc2)) {
gc1.add(Calendar.MONTH, 1);
month++;
}
gc1.add(Calendar.MONTH, -1);
month--;
while (gc1.before(gc2)) {
gc1.add(Calendar.DAY_OF_MONTH, 1);
days++;
}
days--;
//s.oh^ 2013/06/10 月齢計算
String[] birth = mmlBirthday.split("-");
if(birth != null && birth.length == 3) {
years = gc2.get(Calendar.YEAR) - Integer.parseInt(birth[0]);
month = (gc2.get(Calendar.MONTH) + 1) - Integer.parseInt(birth[1]);
days = gc2.get(Calendar.DAY_OF_MONTH) - Integer.parseInt(birth[2]);
if(days < 0) {
month = month - 1;
}
if(month < 0) {
years = years - 1;
month = month + 12;
}
int nowMonth = gc2.get(Calendar.MONTH) + 1;
if(gc2.get(Calendar.DAY_OF_MONTH) > Integer.parseInt(birth[2])) {
days = gc2.get(Calendar.DAY_OF_MONTH) - Integer.parseInt(birth[2]);
}else if(gc2.get(Calendar.DAY_OF_MONTH) == Integer.parseInt(birth[2])) {
days = 0;
}else{
if(nowMonth == 2) {
if(gc2.get(Calendar.YEAR) % 4 == 0) {
if(gc2.get(Calendar.YEAR) % 400 == 0) {
days = 29 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}else if(gc2.get(Calendar.YEAR) % 100 == 0) {
days = 28 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}else{
days = 29 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}
}else{
days = 28 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}
}else if(nowMonth == 1 || nowMonth == 3 || nowMonth == 5 || nowMonth == 7 || nowMonth == 8 || nowMonth == 10 || nowMonth == 12) {
days = 31 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}else{
days = 30 - Integer.parseInt(birth[2]);
days = days + gc2.get(Calendar.DAY_OF_MONTH);
}
}
}
//s.oh$
return new int[]{years, month, days};
} catch (Exception e) {
e.printStackTrace(System.err);
return new int[]{-1, -1, -1};
}
}
public static GregorianCalendar getCalendar(String mmlDate) {
try {
// Trim time if contains
mmlDate = trimTime(mmlDate);
String[] cmp = mmlDate.split("-");
String yearSt = cmp[0];
String monthSt = cmp[1];
if (monthSt.startsWith("0")) {
monthSt = monthSt.substring(1);
}
String daySt = cmp[2];
if (daySt.startsWith("0")) {
daySt = daySt.substring(1);
}
int year = Integer.parseInt(yearSt);
int month = Integer.parseInt(monthSt);
month--;
int day = Integer.parseInt(daySt);
return new GregorianCalendar(year, month, day);
} catch (Exception e) {
e.printStackTrace(System.err);
}
return null;
}
public static String trimTime(String mmlDate) {
if (mmlDate != null) {
int index = mmlDate.indexOf('T');
if (index > -1) {
return mmlDate.substring(0, index);
} else {
return mmlDate;
}
}
return null;
}
}