使用日历从日期格式解析日期时输出错误

时间:2014-04-28 03:14:16

标签: java android datetime calendar simpledateformat

我的代码有什么问题我无法从我想要解析的日期时间得到确切的输出?

String convertDate="03/19/2014 5:30:10 PM";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.CANADA);
Date myDate=new Date();
try {
    myDate=df.parse(convertDate);
    final Calendar c = Calendar.getInstance();
    c.setTime(myDate);
    System.out.println("Year = " + c.get(Calendar.YEAR));
    System.out.println("Month = " + (c.get(Calendar.MONTH)));

    System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
} catch (ParseException e1) {
    e1.printStackTrace();
}

我的输出是

 - 04-28 03:07:15.322: I/System.out(25095): Year = 2015
 - 04-28 03:07:15.322: I/System.out(25095): Month = 6
 - 04-28 03:07:15.322: I/System.out(25095): Day = 3

一定是

 - Year = 2014
 - Month = 03
 - Day = 19

3 个答案:

答案 0 :(得分:2)

从此

更改日期格式
dd/MM/yyyy HH:mm:ss

到这个

MM/dd/yyyy HH:mm:ss

月份基于Zero (0)索引。因此,在检索月份索引后,您必须添加1才能获得当前月份。

因此,请尝试按以下方式打印当月......

int currentMonth = c.get(Calendar.MONTH) + 1;

System.out.println("Month = " + currentMonth);

或者

System.out.println("Month = " + (c.get(Calendar.MONTH)+1));

答案 1 :(得分:1)

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.CANADA);

现在尝试......它会起作用。

有了这个,你必须在你的月份加1。代码在这里:

 String convertDate="03/19/2014 5:30:10 PM";
         DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.CANADA);
         Date myDate=new Date();
         try {
            myDate=df.parse(convertDate);
            final Calendar c = Calendar.getInstance();
            c.setTime(myDate);
            int y,m,d;
            y=Calendar.YEAR;
            System.out.println("Year = " + c.get(Calendar.YEAR));
            //Log.d("Year", y);
            System.out.println("Month = " + (c.get(Calendar.MONTH)+1));

            System.out.println("Day = " + c.get(Calendar.DATE));
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

答案 2 :(得分:1)

不幸的是,the accepted answerthe other answer 都是错误的。

您在解析中犯了两个错误:

  1. 您已将 MM 换成 dd
  2. 您使用 H 而不是 h 来解析带有 AM/PM 标记的日期时间字符串。符号 H 用于解析 24 小时格式的时间字符串。另一个需要考虑的重点是 PM 在 p.m. 中写为 Locale.CANADA。对于您的时间字符串,您可以使用 Locale.US 将其指定为 PM。

因此,您可以使用如下所示的解析器:

new SimpleDateFormat("M/d/u h:m:s a", Locale.US)

其中 a 已用于解析 AM/PM。

使用此解析器将解决您的问题,但旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

使用现代日期时间 API 的演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        String convertDate = "03/19/2014 5:30:10 PM";
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("M/d/u h:m:s a", Locale.US);
        LocalDateTime ldt = LocalDateTime.parse(convertDate, dtfInput);
        System.out.printf("Year: %d, Month: %d, Day: %d%n", ldt.getYear(), ldt.getMonthValue(), ldt.getDayOfMonth());

        // Or, using DateTimeFormatter
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("'Year:' uuuu, 'Month:' M, 'Day:' d", Locale.US);
        System.out.println(ldt.format(dtfOutput));
    }
}

输出:

Year: 2014, Month: 3, Day: 19
Year: 2014, Month: 3, Day: 19

modern date-time API 中了解有关 Trail: Date Time* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project