SimpleDateFormat类中的月份问题

时间:2016-02-26 07:05:26

标签: java android datetime simpledateformat

String expiryDate = "2016-03-14";
private String formatDateTime(String expiryDate, String expiryTime) {
    SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");
    SimpleDateFormat output = new SimpleDateFormat("MMM, dd, yyyy");
    try {
        String formattedDate = output.format(input.parse(expiryDate ));// parse input
        return  formattedDate + ", " + expiryTime;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

然而,当它返回时,它将于2016年1月14日发布。

所需的输出是Mar,14,2016

6 个答案:

答案 0 :(得分:6)

mm应为大写MM。因为

mm 代表分钟    MM 代表月

所以你的格式应该是

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

答案 1 :(得分:3)

mm表示分钟,因此当您使用mm时,它将打印分钟而不是月份。

虽然MM代表几个月。您需要添加如下:

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

答案 2 :(得分:2)

SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

应该是

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

mm应为MM

答案 3 :(得分:1)

SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

需要在上述声明中进行更正,如下所示:

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

使用MM代替mm,因为MM用于月份,而mm用于分钟。

答案 4 :(得分:1)

java.text.SimpleDateFormat内部调用java.util.Locale,它实际实现了日期时间和区域格式模式。因此,Locale MM 定义为月, mm 分钟。所以,使用

SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");将无法匹配任何模式,因此默认情况下,月份将设置为默认值1。它显示给Jan而不是Mar(实际上是你期待的)。

使用 MM 代表Month。它将解决您的问题。

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

答案 5 :(得分:1)

您的问题已经回答,其他答案都是正确的。我想提供你方法的现代版本。

private static DateTimeFormatter output
        = DateTimeFormatter.ofPattern("MMM, dd, yyyy", Locale.ENGLISH);

private static String formatDateTime(String expiryDate, String expiryTime) {
    String formattedDate = LocalDate.parse(expiryDate).format(output);
    return  formattedDate + ", " + expiryTime;
}

当我使用expiryDate 2016-03-14调用此方法时,我会按预期返回Mar, 14, 2016

java.time

你正在使用的SimpleDateFormat(以及其他答案也使用)不仅已经过时了,而且也是出了名的麻烦。我建议你忘记它,而是使用现代Java日期和时间API java.time。与它合作非常好。

您的输入格式2016-03-14与ISO 8601一致,即现代类解析为默认格式,即没有任何明确的格式化程序。所以甚至没有机会在格式模式字符串中弄错MM的情况。

链接: Oracle tutorial: Date Time解释如何使用java.time