当前位置: 首页 > 知识库问答 >
问题:

如何在Android中找到两个日期选择器之间的天数?[重复]

澹台奇略
2023-03-14

我一直在努力从date picker那里找出两次约会的区别。我的应用程序因空点对象异常而崩溃。

java.lang.空指针异常:尝试调用空对象引用上的虚拟方法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);

            }
        });
    }
}

共有2个答案

翟宾实
2023-03-14

没关系,我用乔达图书馆找到了答案

我用不同的用户界面制作了它,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();
                }
            }}
        });

    }
}
百里渊
2023-03-14

通过将字符串放在dateto前面,可以使其成为局部变量的声明,而不是对实例变量(稍后将尝试访问)的引用。所以它将永远是空的。改变:

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

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

但是,日期构造函数不建议使用,强烈不鼓励使用日期,因此您应该真正使用以下内容:

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();
 类似资料:
  • 问题内容: 我有一个基本的查询: 我想在输出中添加另一列…让我们称其为“差异”以找出“ dtcreated”和“ dtlastupdated”之间的天数,例如,如果记录1的dtcreated为1/1/11和dtlastupdated为1/1/12,则“差异”列将为“ 365”。 可以在查询中完成吗? 问题答案: 您将使用: 所以对于您的查询:

  • 我需要计算用户在EditText中输入的两个日期(也包括两个日期)之间的天数。我还需要检查这几天是即将到来还是已经过去。我该怎么做?

  • 问题内容: 我想比较我的Android应用程序的两个日期,但是遇到了一个非常奇怪的问题。 例如: 如果我将日期设置为127天之前: 然后将其与当前日期(两天之间)进行比较 它将返回22,这根本不是预期的结果。 我做错什么了吗?还是班上有问题? 问题答案: 请参考此代码,这可能会对您有所帮助。

  • 我正在使用一个应用程序来计算两个日期之间的剩余天数,即有一个开始日期和结束日期。我想计算每一天到结束日期的剩余天数。请帮帮我。谢啦

  • 问题内容: 如何使用PHP查找两个日期之间的天数? 问题答案:

  • 问题内容: 我正在使用数据库存储日志,其中“日期”列保存了插入日期。日期的格式为“ MM / DD / YY”。请任何人建议我如何在两个特定日期之间选择数据。例如,我尝试了这个: 但是我想这行不通,因为日期不是数字。谢谢您的帮助!:) 问题答案: 使用关键字: