使用SimpleDateFormat

时间:2017-06-30 18:20:10

标签: android simpledateformat

我正在使用以下代码转换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

1 个答案:

答案 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());

新日期/时间API

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign 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));