Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析日期字符串返回错误的月份_Java_Android_Date_Localdate_Threetenbp - Fatal编程技术网

Java 解析日期字符串返回错误的月份

Java 解析日期字符串返回错误的月份,java,android,date,localdate,threetenbp,Java,Android,Date,Localdate,Threetenbp,我试图解析日期字符串,但总是在月份出错。这是我的密码 这是从日历中选择日期的代码 @OnClick(R.id.tedit_tgllahir_addnew) void showTimeDialog(){ calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); date = c

我试图解析日期字符串,但总是在月份出错。这是我的密码

这是从日历中选择日期的代码

@OnClick(R.id.tedit_tgllahir_addnew) void showTimeDialog(){
        calendar = Calendar.getInstance();
        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        date = calendar.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog = new DatePickerDialog(AddDataForNewUserActivity.this,
                new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                        etTgl.setText(String.format("%02d/%02d/%02d", year, month+1, dayOfMonth));
                    }

                }, year, month, date);

        datePickerDialog.show();
    }
这就是我想要解析数据的时候

birth = LocalDate.of(list.getTglLahirAnak().getYear() + 1900, list.getTglLahirAnak().getMonth(), list.getTglLahirAnak().getDate());
                        int year =  Period.between(birth, LocalDate.now()).getYears();
                        int month = Period.between(birth, LocalDate.now()).getMonths();
                        int totalBulan = year * 12 + month;

每当我从日历中输入日期时,它总是显示错误的月份。例如,我选择五月,但在系统中为四月。感谢所有愿意提供帮助的人。

我从您的问题中得知,您正在使用JSR-310的后端口,可能是Android版ThreeTenABP。如果是这样,那就全力以赴,不要再使用那些设计拙劣、过时已久的
日历
日期

即使
Date
类的使用超出了您的控制范围,您仍然必须远离其不推荐的方法,包括
getYear()
getMonth()
getDate()
。当您收到
日期
并将其转换为
本地日期
时,您正在尝试一件好事。从后端口使用
DateTimeUtils
进行第一次转换

但让我们从头开始。使用
LocalDate
设置日期选择器的初始日期。不要使用老式的
日历
类。我还没有编译代码,所以如果有输入错误,请原谅

    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    year = today.getYear();
    month = today.getMonthValue(); // naturally 1-based
    date = today.getDayOfMonth();
    DatePickerDialog datePickerDialog = new DatePickerDialog(AddDataForNewUserActivity.this,
            new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                    // will return to this part later
                }

            }, year, month - 1, date); // Pass 0-based month
当用户从日历/日期选择器中选择日期时,不要将其存储为字符串。将其存储为
LocalDate
对象。这可以避免您以后进行任何解析,并且您的代码还显示您需要一个
LocalDate
。显然,如果要向用户显示所选日期,请将该日期格式化为字符串(仅限于此)。使用
DateTimeFormatter
进行格式化:

private static final DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("yy/MM/dd");
现在我们开始:

                @Override
                public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                    // Store the selected date somewhere you can find it later
                    selectedLocalDate = LocalDate.of(year, month + 1, dayOfMonth);
                    // Display to the user
                    String formattedDate = selectedLocalDate.format(dateFormatter);
                    etTgl.setText(formattedDate);
                }
现在,以月为单位计算年龄不再构成问题:

    birth = selectedLocalDate;
    long totalBulan = Period.between(birth, LocalDate.now(ZoneId.systemDefault()))
                           .toTotalMonths();
如果无法控制从
list.gettglahiranak()
中获得的内容,则从
Date
LocalDate
的转换为:

    Date oldfashionedDate = list.getTglLahirAnak();
    birth = DateTimeUtils.toInstant(oldfashionedDate)
        .atZone(ZoneId.systemDefault())
        .toLocalDate();
现在,年龄的计算和以前一样进行

你的代码出了什么问题?
就像过时的
日历
一样,不推荐使用的
Date.getMonth()
对月份进行编号,从1月的0到12月的11。因此,如果您选择5月份的日期,
list.gettglahiranak().getMonth()
将返回4个5月份的日期。当你把它输入一个带有自然而合理的月份编号的
LocalDate
时,它会给你四月。

我建议你不要使用
Calendar
Date
。这两个类的设计都很糟糕,而且早已过时。只需停留在
LocalDate
Period
from。这是否回答了您的问题。下面的评论在使用ThreeTenABP时是相关的。我写了一个简短的评论。作为旁白,似乎你可以利用它来发挥自己的优势。或者这是否回答了你的问题?