提问人:Tiramochi 提问时间:7/24/2020 最后编辑:AnonymousTiramochi 更新时间:7/24/2020 访问量:474
解析日期字符串返回错误的月份
Parse Date String Return Wrong Month
问:
我尝试解析日期字符串,但总是得到错误的月份。这是我的代码。
这是从日历中选择日期的代码
@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月”。感谢所有愿意提供帮助的人。
答:
我从你的问题中了解到,你正在使用 JSR-310 的向后移植,可能是 Android 版,ThreeTenABP。如果是这样,请全力以赴,放弃使用设计不佳且早已过时的类。Calendar
Date
即使该类的使用不受您的控制,您仍然必须远离其已弃用的方法,包括 和 。当收到 a 并将其转换为第一件事时,您正在尝试好事。从向后移植用于首次转换。Date
getYear()
getMonth()
getDate()
Date
LocalDate
DateTimeUtils
但是,让我们从顶部开始。用于设置日期选取器的初始日期。不要使用老式的类。我没有编译代码,所以如果有错别字,请见谅。LocalDate
Calendar
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 进行格式设置: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.getTglLahirAnak()
Date
LocalDate
Date oldfashionedDate = list.getTglLahirAnak();
birth = DateTimeUtils.toInstant(oldfashionedDate)
.atZone(ZoneId.systemDefault())
.toLocalDate();
现在,年龄的计算像以前一样进行。
你的代码出了什么问题?
就像过时的,弃用的数字一样,从 0 月的月份到 11 月份的月份,12 月。因此,如果选择 5 月的日期,则返回 5 月的 4。当你把它输入到一个自然而合理的月份编号中时,它会给你四月。Calendar
Date.getMonth()
list.getTglLahirAnak().getMonth()
LocalDate
评论
Calendar
Date
LocalDate
Period
Period.toTotalMonths()
来发挥自己的优势。