【问题标题】:How do I find days between two date pickers in android? [duplicate]如何在android中找到两个日期选择器之间的天数? [复制]
【发布时间】:2020-07-15 00:08:42
【问题描述】:

我一直试图从日期选择器中找出两个日期之间的差异。我的应用因空点对象异常而崩溃。

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“long java.util.Date.getTime()”

package com.cksapp.dateformat;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import static java.util.Calendar.YEAR;

public class MainActivity extends AppCompatActivity {

    TextView t1, t2, t3, t4, difference;
    Button b1;
    Date datefrom, dateOne;
    Date dateto, dateTwo;
    Date d1, d2;

    private DatePickerDialog.OnDateSetListener mDate1;
    private DatePickerDialog.OnDateSetListener mDate2;
    private Object Date;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1 = findViewById(R.id.textView);
        t2 = findViewById(R.id.textView2);
        t3 = findViewById(R.id.textView3);
        t4 = findViewById(R.id.textView4);
        difference = findViewById(R.id.textView7);
        b1 = findViewById(R.id.button);


        t1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar c = Calendar.getInstance();
                int year = c.get(YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);
                DatePickerDialog dialog = new DatePickerDialog(MainActivity.this,
                        android.R.style.Theme_Holo_Dialog_MinWidth,
                        mDate1,
                        year,month,day);
                //Date dateOne = c.getTime();
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();
            }
        });

        mDate1 = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                month = month + 1;
                String datefrom = month + "/" + dayOfMonth + "/" + year;

                t2.setText(datefrom);
            }
        };

        //next
        t3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar c = Calendar.getInstance();
                int year = c.get(YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);
                DatePickerDialog dialog = new DatePickerDialog(MainActivity.this,
                        android.R.style.Theme_Holo_Dialog_MinWidth,
                        mDate2,
                        year,month,day);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();
            }
        });
        mDate2 = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                month = month + 1;
                String dateto = month + "/" + dayOfMonth + "/" + year;
                t4.setText(dateto);
            }
        };

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //This is where I tried performing subtraction but it didn't work
                long diff = dateto.getTime() - datefrom.getTime();
                difference.setText((int) diff);

            }
        });
    }
}

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友。看看您是否可以使用desugaring 或将ThreeTenABP 添加到您的Android 项目中,以便使用现代Java 日期和时间API 的java.time。使用起来感觉好多了。

标签: android android-studio date datepicker


【解决方案1】:

通过将 String 放在 dateto 前面,您已经使它成为一个局部变量的声明,而不是对实例变量的引用(您稍后会尝试访问)。所以它将永远为空。变化:

String dateto = month + "/" + dayOfMonth + "/" + year;

dateto = new Date(month, dayOfMonth, year);  // no "String" 

但是,不推荐使用 Date 构造函数,并且强烈建议不要使用 Date,因此您应该真正使用类似的东西:

import java.time.LocalDate;
import java.time.Instant;
import java.time.ZoneOffset;

//... 
Instant dateto;
//... 
LocalDate localDate = LocalDate.of(month, dayOfMonth, year);
dateto = localDate.atStartOfDay(ZoneOffset.UTC).toInstant();

【讨论】:

  • 这很有效,谢谢我如何计算两个日期之间的天数?
  • 嗨@ChandrakishoreReddy,网上有很多例子。与其等待 S.O. 的回答,我谦虚地建议通过简单的 Google 搜索节省一些时间。
【解决方案2】:

没关系,我使用 joda 库找到了答案

我使用不同的 UI 制作了它,joda 库依赖项包含在 build.gradle 中。效果很好。

package com.cksapp.newdateformat;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;

import net.danlew.android.joda.JodaTimeAndroid;

import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.Period;
import org.joda.time.PeriodType;

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

import static org.joda.time.Days.daysBetween;

public class MainActivity extends AppCompatActivity {

    TextView t1, t2, t3, t4, today;
    Button b1, b2, b3;
    String date1, date2, todaydate;
    int daysy, daysm, daysd, daysss;
    DatePickerDialog.OnDateSetListener dateSetListener;
    DatePickerDialog.OnDateSetListener dateSetListener2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JodaTimeAndroid.init(this);
        today = findViewById(R.id.today);
        t1 = findViewById(R.id.starttext);
        t2 = findViewById(R.id.endtext);
        t3 = findViewById(R.id.daystext);
        t4 = findViewById(R.id.daysinyears);
        b1 = findViewById(R.id.startbutton);
        b2 = findViewById(R.id.endbutton);
        b3 = findViewById(R.id.calculatebutton);

        Calendar c = Calendar.getInstance();
        final int year = c.get(Calendar.YEAR);
        final int month = c.get(Calendar.MONTH);
        final int day = c.get(Calendar.DAY_OF_MONTH);

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        todaydate = sdf.format(Calendar.getInstance().getTime());
        today.setText("Today is " + todaydate);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerDialog datePickerDialog = new DatePickerDialog(v.getContext(),dateSetListener,year,month,day);
                datePickerDialog.getDatePicker().setMaxDate(new Date().getTime());
                datePickerDialog.show();
            }
        });
        dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                month = month + 1;
                date1 = dayOfMonth + "/" + month + "/" + year;
                t1.setText(date1);
            }
        };

        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerDialog datePickerDialog2 = new DatePickerDialog(v.getContext(),dateSetListener2,year,month,day);
                datePickerDialog2.getDatePicker().setMaxDate(new Date().getTime());
                datePickerDialog2.show();
            }
        });
        dateSetListener2 = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                month = month + 1;
                date2 = dayOfMonth + "/" + month + "/" + year;
                t2.setText(date2);
            }
        };
        b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(date1 == null || date2 == null){
                    Toast.makeText(getApplicationContext(), "Please enter the date field(s)",Toast.LENGTH_SHORT).show();
                }
                else {
                SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    Date d1 = sdf1.parse(date1);
                    Date d2 = sdf1.parse(date2);
                    long fromdate = d1.getTime();
                    long todate = d2.getTime();

                    Period p = new Period(fromdate, todate, PeriodType.yearMonthDay());
                    int years = p.getYears();
                    int months = p.getMonths();
                    int days = p.getDays();
                    t4.setText(years + " years" + months + " months" + days + " days");

                   int diff = (int) (d2.getTime() - d1.getTime());
                   int YO = diff/86400000;
                    //Log.d("Days", String.valueOf(diff));
                    t3.setText(String.valueOf(YO));



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

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2012-01-05
    • 2011-05-29
    • 2011-06-24
    • 2011-02-07
    相关资源
    最近更新 更多