我正在使用以下代码转换DatePicker
的日期格式:
public void onDateSet(DatePicker view, int year, int month, int day) {
System.out.println("year=" + year + "day=" + day + "month="
+ month);
String myFormat = "dd-M-yyyy";
String dateStr = day + "-" + month + "-" + year;
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.ENGLISH);
SimpleDateFormat originalFormat = new SimpleDateFormat(myFormat, Locale.ENGLISH);
SimpleDateFormat targetFormat = new SimpleDateFormat("dd,MMMM yyyy");
Date date = originalFormat.parse(dateStr);
String formattedDate = targetFormat.format(date);
System.out.println(formattedDate);
}
不幸的是,这是一个错误:
错误:(115,45)错误:未报告的异常ParseException;必须被抓住或宣布被抛出
我尝试为其添加throws
:
public void onDateSet(DatePicker view, int year, int month, int day) throws ParseException {
System.out.println("year=" + year + "day=" + day + "month="
+ month);
String myFormat = "dd-M-yyyy";
String dateStr = day + "-" + month + "-" + year;
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.ENGLISH);
SimpleDateFormat originalFormat = new SimpleDateFormat(myFormat, Locale.ENGLISH);
SimpleDateFormat targetFormat = new SimpleDateFormat("dd,MMMM yyyy");
String effDate = targetFormat.format(originalFormat.parse(dateStr));
System.out.println(effDate);
}
新错误显示为
错误:(106,21)错误:DateDickerFragment中的onDateSet(DatePicker,int,int,int)无法在OnDateSetListener中实现onDateSet(DatePicker,int,int,int),重写方法不会抛出ParseException
答案 0 :(得分:2)
发生此错误是因为parse
method throws a ParseException
- 此例外是经过检查的,并且需要handled properly:将代码放入try/catch
块或 declaring that the method onDateSet
throws the exception(在方法声明中添加throws ParseException
)。 在您的情况下,由于您似乎正在扩展类或实现接口,只需将代码放在try/catch
块中。
另一个细节是您不需要创建3个SimpleDateFormat
个实例。只有一个就足够了,输出(targetFormat
)。
要构建日期对象,只需使用java.util.Calendar
- 提醒您在此API中,月份从零开始(是的,1月份为0
,所以您可能必须减去1
- 检查您的API是否正确获得月份):
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.DAY_OF_MONTH, day);
SimpleDateFormat targetFormat = new SimpleDateFormat("dd,MMMM yyyy", Locale.ENGLISH);
String formattedDate = targetFormat.format(cal.getTime());
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design issues,它们将被新API取代。< / p>
如果您可以在项目中添加依赖项,那么在Android中,您可以使用ThreeTen Backport,这是Java 8的新日期/时间类的优秀后端,以及ThreeTenABP(更多)关于如何使用它here)。
所有相关课程都在org.threeten.bp
包中。代码非常简单,您不必担心零索引月(此API中的1月为1
):
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.LocalDate;
DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern("dd,MMMM yyyy", Locale.ENGLISH);
String formattedDate = targetFormat.format(LocalDate.of(year, month, day));