2016-06-23 11 views
1

Ich habe eine Lösung mit der Überarbeitung einiger Beispiele, die ich online zu bekommen Tage bis zum Geburtstag, aber ich habe einen Fehler/Problem mit einer Bedingung in meiner Methode.Android Kalender Kommissionierung Geburtstag gibt falsche Tage für eine Bedingung

activity.java

private Profiles.AgeCalculation age = null; //this is in the class, and not onCreate 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_transition_edit); 

    //Age Calculation 
    age = new Profiles.AgeCalculation(); 
    age.getCurrentDate(); 
} 
//includes for age calculation 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
     case DATE_START_DIALOG_ID: 
      return new DatePickerDialog(this, 
        mDateSetListener, 
        startYear, startMonth, startDay); 
    } 
    return null; 
} 

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
    public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { 
     startYear=selectedYear; 
     startMonth=selectedMonth; 
     startDay=selectedDay; 
     System.out.println("Birth Year: " + startYear); 
     System.out.println("Birth Month: " + startMonth); 
     System.out.println("Birth Day: " + startDay); 
     age.setDateOfBirth(startYear, startMonth, startDay); 
     //birthDate.setText("Date of Birth(DD/MM/YY): "+selectedDay+":"+(startMonth+1)+":"+startYear); 
     //calculateAge(); 
     //age.daysRemaining(); 
     calculateYear(); 
    } 
}; 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
     case R.id.age_button: 
      showDialog(DATE_START_DIALOG_ID); 
      break; 

     default: 
      break; 
    } 
} 
    private void calculateYear() 
{ 
    age.calcualteYear(); 
    age.calcualteMonth(); 
    age.calcualteDay(); 
    age.daysRemaining(); 
    //Toast.makeText(getBaseContext(), "click the resulted button"+age.getResult() , Toast.LENGTH_SHORT).show(); 
    textViewDisplayAge.setText(age.getYearsOld() + " Years Old"); 
} 

AgeCalculation.java

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.Locale; 

public class AgeCalculation { 
private int startYear; //birth year 
private int startMonth; //birth month 
private int startDay; //birth day 
private int endYear; 
private int endMonth; 
private int endDay; 
private int resultYear; 
private int checkFor16; 
private int resultMonth; 
private int resultDay; 
private Calendar start; 
private Calendar end; 
public String getCurrentDate() //gets current date of mobile device using Calendar 
{ 
    end=Calendar.getInstance(); 
    endYear=end.get(Calendar.YEAR); 
    endMonth=end.get(Calendar.MONTH); 
    endMonth++; 
    endDay=end.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Current Year: " + endYear); 
    System.out.println("Current Month: " + endMonth); 
    System.out.println("Current Day: " + endDay); 
    return endDay+":"+endMonth+":"+endYear; 
} 
public void setDateOfBirth(int sYear, int sMonth, int sDay) 
{ 
    startYear=sYear; 
    startMonth=sMonth; 
    startMonth++; 
    startDay=sDay; 

} 
public void calcualteYear() 
{ 
    resultYear=endYear-startYear; 
    checkFor16 = endYear-startYear; 
    //In this year the user will be this age 
    System.out.println("caculateYear: " + resultYear); 
    System.out.println("checkFor 16 years old: " + checkFor16); 

} 

public void calcualteMonth() 
{ 
    if(endMonth>=startMonth) 
    { 
     resultMonth= endMonth-startMonth; 
    } 
    else 
    { 
     resultMonth=endMonth-startMonth; 
     resultMonth=12+resultMonth; 
     resultYear--; 
    } 
    System.out.println("calculateMonth: " + resultMonth); 

} 
public void calcualteDay() 
{ 

    if(endDay>=startDay) 
    { 
     resultDay= endDay-startDay; 
    } 
    else 
    { 
     resultDay=endDay-startDay; 
     resultDay=30+resultDay; 
     if(resultMonth==0) 
     { 
      resultMonth=11; 
      resultYear--; 
     } 
     else 
     { 
      resultMonth--; 
     } 

    } 
    System.out.println("calculateDay: " + resultDay); 
} 

public String getResult() 
{ 
    return resultDay+":"+resultMonth+":"+resultYear; 
} 

public int getYearsOld(){ 
    return resultYear; //returns the age of the user 
} 

public void daysRemaining(){ 

    final String strBDay = String.valueOf(startDay) + "/" + String.valueOf(startMonth) + "/" + String.valueOf(startYear); 

    Date example = null; 
    DateFormat dateFormat; 
    dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.US); 
    try { 
     example = new Date(dateFormat.parse(strBDay).getTime()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 


    final Calendar BDay = Calendar.getInstance(); 
    BDay.setTime(example); 

    final Calendar today = Calendar.getInstance(); 

    // Take your DOB Month and compare it to current month 
    final int BMonth = BDay.get(Calendar.MONTH); 
    final int CMonth = today.get(Calendar.MONTH); 
    BDay.set(Calendar.YEAR, today.get(Calendar.YEAR)); 
    if(BMonth <= CMonth) 
    { 
     BDay.set(Calendar.YEAR, today.get(Calendar.YEAR) + 1); 
    } 

    long now = new Date().getTime(); 

    // Result in millis 
    final long millis = BDay.getTimeInMillis() - now; 

    // Convert to days 
    final long days = millis/86400000; // Precalculated (24 * 60 * 60 * 1000) birthday - system time/milliseconds to get the value in days 
    final long days30 = 2592000000L; 

    if (millis <= days30 && checkFor16 == 16) { 
     System.out.println("You are WITHIN 30 days of turning 16yrs old"); 
    }else if (millis > days30 && checkFor16 == 16){ 
     System.out.println("You are MORE THAN 30 DAYS OF BECOMING the age of 16"); 
    }else if(resultYear > 15) { 
     System.out.println("You are OVER the age of 16"); 
    }else if(checkFor16 < 16 && millis == days30){ 
     System.out.println("You are BELOW the age of 16"); 
    } 

    System.out.println("Left days to bday: " + days); 

    //System.out.println("It will be  : " + dayOfTheWeek); 
} 
} 

Nun, wenn ich in 23. Juni 2016 gesetzt - der Zustand ist gut. es bedeutet, dass du 15 Jahre alt bist und 30 Tage bis du 16 Jahre alt bist. Und mit meinem Projekt soll das akzeptabel sein.

Immer wenn ich den Geburtstag vor dem heutigen Datum Juni 22/06/2016 als Beispiel 30 stelle, dann gibt die day etwas wie für zB Linke Tage zu bday zurück: 341. Während wenn ich 1. Juli stelle. es gibt korrekt "7 Tage bis Sie 16 werden" zurück. Wenn Sie ein Datum eingeben, das Sie 14 Jahre und jünger macht, funktioniert es korrekt.

Wenn alle diese Erklärung für alle, ist verwirrend, versuche ich, im Grunde die folgenden Bedingungen zu erhalten:

Überprüfen Sie die folgenden>

  1. Wenn Sie: Wenn Sie Ihren Geburtstag mit dem Datepicker eingeben 16, darf sich in.
  2. Wenn Sie über 16 sind, sind Sie in erlaubt.
  3. Wenn Sie 30 Tage bis zum 16. Drehen Sie erlaubt sind.
  4. Wenn Sie 31 Tage, bis Sie 16 drehen, dann sind Sie nicht erlaubt in, im Grunde, weil Sie sind 15.
  5. Wenn Sie unter dem Alter von 16, 15 bedeutet, und unten, dann sind Sie nicht erlaubt in.

Kann mir bitte jemand helfen, herauszufinden, was das Problem ist, und was man für die Bedingungen verwenden soll, es kann für den Moment einfach Toast sein. Der Code, der in jedem von ihnen ausgeführt wird, wird erstellt, wenn ich dies behoben und ordnungsgemäß funktioniert. Wenn nicht, kann ich das Projekt nicht weiter

EDIT: Ich mag

  1. dass, wenn Sie setzen Ihren Geburtstag jeden Tag bis zu dem heutigen Datum im Jahr 2000 von der Datumsauswahl sein , es sagt ein Toast, dass Sie
    sind 16, und CAN durch.
  2. Und wenn Sie einen Geburtstag, der 30 Tage (1 Monat) weiter vom heutigen Datum ist, dann Sie CAN passieren auch (ich schätzte, dass zu Juli 24 sein), weil Sie noch 1 Monat bis Sie haben werden drehen 16.
  3. und wenn Sie Ihren Geburtstag setzen, die 31 Tage oder mehr weiter weg von dem heutigen Datum liegt (i geschätzt, dass 25 + Juli zu sein), dann Sie KANN NICHT durchlaufen, weil Sie 15 mit mehr als 30 Tage zu deinem Geburtstag.

kam ich mit dieser Einstellung zu meinem Code, aber es ist es nicht schneiden (was ich will, wie oben angegeben)

 final long daysOf30MilliSeconds = days30/86400000; 

    if (days <= daysOf30MilliSeconds && checkFor16 == 16) { 
     System.out.println("You are WITHIN 30 days of turning 16yrs old"); 
    }else if (days > daysOf30MilliSeconds && checkFor16 == 16){ 
     System.out.println("You are MORE THAN 30 DAYS OF BECOMING the age of 16"); 
    }else if(resultYear >= 16) { 
     System.out.println("You are OVER the age of 16"); 
    }else if(resultYear < 16){ 
     System.out.println("You are BELOW the age of 16"); 
    }else if(resultYear == 16){ 
     System.out.println("You are 16, you can apply"); 
    } 

Alles was ich brauche ist die conditionals Ich denke, die Antwort jemand zur Verfügung stellen kann zu dem Problem?

+0

In TagenRemaining(), vergleichen Sie Millis mit days30 .. Millis kann + ve auch und -ve auch sein, und sind in Millisekunden .. während Tag30 ist Monat .. – user388229

+0

Mit dieser Aussage, die ich versuchte zu vergleichen Millis (die Zeit, die die Person verlassen hat, um das Alter zu beenden, wenn ihr Alter von dem heutigen Datum weiter entfernt ist) auf 30 Tage in Millisekunden. Habe ich das falsch gemacht, oder sollte ich "Tage" anstelle von "Millis" verwenden? Habe ich ein falsches Konzept? – masterplox

+0

Ich habe das Problem mit dem, was Sie sagten, herausgefunden - user388229, und ich habe Anpassungen am obigen Beitrag vorgenommen. Bitte schau es dir an – masterplox

Antwort

0

Hier ist die Methode, die ich verwenden Alter von Geburtstag zu extrahieren:

private String getAge(int year, int month, int day) { 

    String age; 
    int ageYear; 
    int ageMonth; 

    Calendar birth = Calendar.getInstance(); 
    Calendar today = Calendar.getInstance(); 

    birth.set(year, month, day); 

    ageYear = today.get(Calendar.YEAR) - birth.get(Calendar.YEAR); 

    // if I am borned on february 1st, 2000 and we are on april 1st, 2000 : 
    // 4 - 2 = 2 months 
    // if I am borned on april 1st, 2000 and we are on february 1st, 2001 
    // 12 - (4 - 2) = 10 months 
    if (today.get(Calendar.MONTH) > birth.get(Calendar.MONTH)) { 

     ageMonth = today.get(Calendar.MONTH) - birth.get(Calendar.MONTH); 

    } 

    else { 

     ageMonth = 12 - birth.get(Calendar.MONTH) - today.get(Calendar.MONTH); 

     ageYear--; 

    } 

    age = ageYear + " years and " + ageMonth + " months"; 

    return age; 

} 

ageYear und ageMonth könnte Klasse scoped Eigenschaften und deren Werte könnten in einer conditionnal Anweisung verwendet werden:

if (ageYear >= 16) then ... 

if (ageYear == 15 && ageMonth == 11) then... 

else then... 

Das zurückgegebene Alter dient nur zu Testzwecken und kann entweder als Protokoll oder Toast angezeigt werden.

+0

Also bin ich ziemlich naiv zu den ganzen phantastischen Sachen, die du mit der Klasse sagst, aber bedeutet das, dass meine ganze Klasse von AgeCalculation durch deine Methode ersetzt werden kann? – masterplox

+0

Nein. Dies bedeutet, dass Sie Variablen außerhalb der onCreate-Methode deklarieren und ihnen einen Wert in Ihrer getAge-Methode geben müssen. getAge geht unter onCreate und wird aufgerufen, wenn der Benutzer seinen Geburtstag wählt. –

+0

Hey Alexandre Martin, kannst du das Update sehen, das ich heute gemacht habe? Hast du jetzt irgendwelche Lösungen für das Problem? Ich habe schon ein paar Probleme behoben, nur eine ist noch übrig. Vielen Dank – masterplox