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

Parse Date String Return Wrong Month

提问人:Tiramochi 提问时间:7/24/2020 最后编辑:AnonymousTiramochi 更新时间:7/24/2020 访问量:474

问:

我尝试解析日期字符串,但总是得到错误的月份。这是我的代码。

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

@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;

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

java android 日期 localdate 三tenbp

评论

2赞 Anonymous 7/24/2020
我建议你既不使用也不使用。这两类都设计得很差,早已过时。只需使用 java.time(现代 Java 日期和时间 API)即可。CalendarDateLocalDatePeriod
0赞 Anonymous 7/24/2020
这回答了你的问题吗?将 java.util.Date 转换为 java.time.LocalDate此答案下的评论在使用ThreeTenABP时是相关的.
0赞 Anonymous 7/24/2020
我在这里为你写了一个快速的新答案
0赞 Anonymous 7/24/2020
顺便说一句,您似乎可以使用 Period.toTotalMonths() 来发挥自己的优势。
0赞 Anonymous 7/24/2020
或者这回答了你的问题吗?SimpleDateFormat. 格式返回错误的日期

答:

1赞 Anonymous 7/24/2020 #1

我从你的问题中了解到,你正在使用 JSR-310 的向后移植,可能是 Android 版,ThreeTenABP。如果是这样,请全力以赴,放弃使用设计不佳且早已过时的类。CalendarDate

即使该类的使用不受您的控制,您仍然必须远离其已弃用的方法,包括 和 。当收到 a 并将其转换为第一件事时,您正在尝试好事。从向后移植用于首次转换。DategetYear()getMonth()getDate()DateLocalDateDateTimeUtils

但是,让我们从顶部开始。用于设置日期选取器的初始日期。不要使用老式的类。我没有编译代码,所以如果有错别字,请见谅。LocalDateCalendar

    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

当用户从日历/日期选取器中选择日期时,请勿将其存储为字符串。将其存储为对象。这样可以避免以后进行任何解析,并且您的代码还显示您需要一个 .显然,如果要向用户显示所选日期,请将日期格式化为字符串以达到此目的(仅)。使用 a 进行格式设置:LocalDateLocalDateDateTimeFormatter

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.getTglLahirAnak()DateLocalDate

    Date oldfashionedDate = list.getTglLahirAnak();
    birth = DateTimeUtils.toInstant(oldfashionedDate)
        .atZone(ZoneId.systemDefault())
        .toLocalDate();

现在,年龄的计算像以前一样进行。

你的代码出了什么问题?

就像过时的,弃用的数字一样,从 0 月的月份到 11 月份的月份,12 月。因此,如果选择 5 月的日期,则返回 5 月的 4。当你把它输入到一个自然而合理的月份编号中时,它会给你四月。CalendarDate.getMonth()list.getTglLahirAnak().getMonth()LocalDate