# TimePicker Zeiten subtrahieren.



## TheWalkingFrame (17. Nov 2020)

Ich bin ein neuling was Java programmierung angeht, darum bin ich für jede Hilfe und Tipps sehr dankbar.

In meinem Project habe ich mir 2 Timepicker erstellt, jeweils für Startzeit und Endzeit. Die Zeiten werden jeweils in ein Textview ausgegeben im 24 Stunden format.

Ich möchte nun nach eingabe von Start und Endzeit die differenz dieser beiden Zeiten berechnen und in ein weiteres Textview ausgeben. Wie kann ich das bewerkstelligen?






```
package com.example.datetestneu;

import androidx.appcompat.app.AppCompatActivity;

import android.app.TimePickerDialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;

import org.joda.time.DateTime;
import org.joda.time.Interval;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnBeginnt, btnEndet;
    TextView tvBeginnt, tvEndet, tvDauer;


    int time1beginnHour, time1beginnMinute;
    int time2beginnHour, time2beginnMinute;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btnBeginnt = (Button) findViewById(R.id.btnBeginnt);
        btnBeginnt.setOnClickListener(this);

        btnEndet = (Button) findViewById(R.id.btnEndet);
        btnEndet.setOnClickListener(this);

        tvBeginnt = (TextView) findViewById(R.id.tvBeginnt);
        tvEndet = (TextView) findViewById(R.id.tvEndet);
        tvDauer = (TextView) findViewById(R.id.tvDauer);
        tvTest = (TextView) findViewById(R.id.tvTest);
        tvtest2 = (TextView) findViewById(R.id.tvTest2);


    }


    //Timepicker
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnBeginnt: {
                btnBeginnt.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //Initialize time picker dialog
                        TimePickerDialog timePickerDialog = new TimePickerDialog(
                                MainActivity.this,
                                android.R.style.Theme_Holo,
                                new TimePickerDialog.OnTimeSetListener() {
                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

                                        //Initialize hour and minute
                                        time1beginnHour = hourOfDay;
                                        time1beginnMinute = minute;

                                        //Store hour and minute in string
                                        String time = time1beginnHour + ":" + time1beginnMinute;

                                        //Initialize 24 hours time format
                                        SimpleDateFormat f24Hours = new SimpleDateFormat(
                                                "HH:mm"
                                        );
                                        try {
                                            Date date = f24Hours.parse(time);
                                            //Initialize 12 hours time format
                                            SimpleDateFormat f12Hours = new SimpleDateFormat(
                                                    "HH:mm aa"
                                            );

                                            //Set selected time on text view
                                            tvBeginnt.setText(f24Hours.format(date));
                                        } catch (ParseException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }, 12, 0, true
                        );

                        //Set transparent background
                        timePickerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

                        //Displayed previous selected time
                        timePickerDialog.updateTime(time1beginnHour, time1beginnMinute);

                        //Show Dialog
                        timePickerDialog.show();
                    }
                });

                break;
            }
                case R.id.btnEndet: {
                     btnEndet.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //Initialize time picker dialog
                        TimePickerDialog timePickerDialog = new TimePickerDialog(
                                MainActivity.this,
                                android.R.style.Theme_Holo,
                                new TimePickerDialog.OnTimeSetListener() {
                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

                                        //Initialize hour and minute
                                        time2beginnHour = hourOfDay;
                                        time2beginnMinute = minute;

                                        //Store hour and minute in string
                                        String time = time2beginnHour + ":" + time2beginnMinute;

                                        //Initialize 24 hours time format
                                        SimpleDateFormat f24Hours = new SimpleDateFormat(
                                                "HH:mm"
                                        );
                                        try {
                                            Date date = f24Hours.parse(time);
                                            //Initialize 12 hours time format
                                            SimpleDateFormat f12Hours = new SimpleDateFormat(
                                                    "HH:mm aa"
                                            );

                                            //Set selected time on text view
                                            tvEndet.setText(f24Hours.format(date));
                                        } catch (ParseException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }, 12, 0, true
                        );

                        //Set transparent background
                        timePickerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

                        //Displayed previous selected time
                        timePickerDialog.updateTime(time2beginnHour, time2beginnMinute);

                        //Show Dialog
                        timePickerDialog.show();
                    }
                });
         }
        }
      }
    }
```


----------



## mrBrown (17. Nov 2020)

Du speicherst doch schon time1beginnHour, time1beginnMinute, time2beginnHour & time2beginnMinute, du musst jetzt nur noch die beiden Differenzen in einem TextView anzeigen lassen, so wie du es auch schon mit anderen Dingen machst.


Zwar nicht die Frage, aber trotzdem auffällig: 

```
@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnBeginnt: {
                btnBeginnt.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
```

Das ist nahezu immer ein Zeichen dafür, dass etwas falsch ist. Du fügst dort dem Button einen Listener hinzu, nachdem er geklickt wurde – sinnvoller ist es, den Listener direkt zu setzen.


----------



## TheWalkingFrame (18. Nov 2020)

Vielen Dank für deine schnelle Antwort. Leider habe ich da noch so meine Probleme und bekomme das mit der Differenz nicht hin. Habe es mit Duration probiert, jedoch mache ich da anscheinend was falsch.


----------



## TheWalkingFrame (20. Nov 2020)

Ich habe mein Programm ein wenig abgeändert. Da ich die Zeiten auch über Mitternacht rechnen möchte, habe ich zusätzlich einen DatePicker hinzugefügt. Was mir jedoch noch fehlt ist die Berechnung der Differenz beider Zeiten. Die ausgewählten Daten und Zeiten werden mir nun in den TextViews tvBeginnt und tvEndet angezeigt. Wie bekomme ich nun die Werte der beiden Calendar Inputs in die Differenzberechnung ?



```
package com.example.datetestneu;


        import androidx.appcompat.app.AppCompatActivity;
        import android.app.DatePickerDialog;
        import android.app.TimePickerDialog;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.DatePicker;
        import android.widget.TextView;
        import android.widget.TimePicker;
        import java.text.SimpleDateFormat;
        import java.util.Calendar;


public class MainActivity extends AppCompatActivity {

    Button btnBeginnt, btnEndet;
    TextView tvBeginnt, tvEndet, tvDauer;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btnBeginnt = (Button) findViewById(R.id.btnBeginnt);
        btnEndet = (Button) findViewById(R.id.btnEndet);

        tvBeginnt = (TextView) findViewById(R.id.tvBeginnt);
        tvEndet = (TextView) findViewById(R.id.tvEndet);
        tvDauer = (TextView) findViewById(R.id.tvDauer);


        //TimeDatePicker on Button Beginn
        btnBeginnt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                showDateTimeDialogStart(btnBeginnt);
            }
        });
        //TimeDatePicker on Button Ende
        btnEndet.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                showDateTimeDialogEnd(btnEndet);
            }
        });

    }


    //DateTimePicker Funktion Button Beginn
    private void showDateTimeDialogStart(Button btnBeginnt) {

        final Calendar calendarStart = Calendar.getInstance();
        DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                calendarStart.set(Calendar.YEAR, year);
                calendarStart.set(Calendar.MONTH, month);
                calendarStart.set(Calendar.DAY_OF_MONTH, dayOfMonth);


                TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        calendarStart.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        calendarStart.set(Calendar.MINUTE, minute);

                        //Formatierung Datum/Zeit in dd.MM.yyy HH:mm
                        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("dd.MM.yyyy HH:mm");

                        //Ausgabe Datum/Zeit in TextView Beginn
                        tvBeginnt.setText(simpleDateFormat1.format(calendarStart.getTime()));

                    }
                };

                //TimePickerDialog Anzeigen lassen
                new TimePickerDialog(MainActivity.this, timeSetListener, calendarStart.get(Calendar.HOUR_OF_DAY), calendarStart.get(Calendar.MINUTE), true).show();

            }
        };

        //TimePickerDialog Anzeigen lassen
        new DatePickerDialog(MainActivity.this, dateSetListener, calendarStart.get(Calendar.YEAR), calendarStart.get(Calendar.MONTH), calendarStart.get(Calendar.DAY_OF_MONTH)).show();
        
    }


    //DateTimePicker Funktion Button Ende
    private void showDateTimeDialogEnd(Button btnEndet) {

        final Calendar calendarEnd = Calendar.getInstance();
        DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                calendarEnd.set(Calendar.YEAR, year);
                calendarEnd.set(Calendar.MONTH, month);
                calendarEnd.set(Calendar.DAY_OF_MONTH, dayOfMonth);

                TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        calendarEnd.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        calendarEnd.set(Calendar.MINUTE, minute);

                        //Formatierung Datum/Zeit in dd.MM.yyy HH:mm
                        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("dd.MM.yyyy HH:mm");

                        //Ausgabe Datum/Zeit in TextView Ende
                        tvEndet.setText(simpleDateFormat2.format(calendarEnd.getTime()));

                    }
                };

                //TimePickerDialog Anzeigen lassen
                new TimePickerDialog(MainActivity.this, timeSetListener, calendarEnd.get(Calendar.HOUR_OF_DAY), calendarEnd.get(Calendar.MINUTE), true).show();
            }
        };
                //TimePickerDialog Anzeigen lassen
                new DatePickerDialog(MainActivity.this, dateSetListener, calendarEnd.get(Calendar.YEAR), calendarEnd.get(Calendar.MONTH), calendarEnd.get(Calendar.DAY_OF_MONTH)).show();
        
        }
}
```


----------



## TheWalkingFrame (24. Nov 2020)

Ich habe es nun geschafft und es funktioniert (fast) alles so wie es soll. Die Datepicker und Timepicker  funktionieren wunderbar, die Ausgabe beider Daten und Zeiten in ihr TextView auch. Nun ist mir aufgefallen, dass die App am Smartphone einen Rechenfehler macht. Wenn die Differenz der Zeiten aus den TimePickerDialogen gerechnet und als HH:mm ausgegeben werden, Rechnet er mir immer 1Stunde mehr dazu. Das komische ist, dass im Emulator von Android Studio die Berechnung richtig funktioniert, da jedoch eine andere Zeitzone nimmt, weil er bei der Ausgabe der TimePickerDialoge eine Stunde zurück ist gegenüber der Systemzeit.


----------

