Java 使用日历从DateFormat分析日期时输出错误

Java 使用日历从DateFormat分析日期时输出错误,java,android,datetime,calendar,simpledateformat,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.get

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

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
现在试试。。。会有用的

这个月你必须加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();
        }
现在试试。。。会有用的

这个月你必须加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();
        }

从此更改日期格式

dd/MM/yyyy HH:mm:ss
对此

MM/dd/yyyy HH:mm:ss
月份是基于索引的
0(0)
。因此,在检索月份索引后,必须添加
1
才能获取当前月份

所以,试着按如下方式打印当前月份

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

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


从此更改日期格式

dd/MM/yyyy HH:mm:ss
对此

MM/dd/yyyy HH:mm:ss
月份是基于索引的
0(0)
。因此,在检索月份索引后,必须添加
1
才能获取当前月份

所以,试着按如下方式打印当前月份

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

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

不幸的是,我们也错了

您在分析过程中犯了两个错误:

  • 您已将
    MM
    dd
    交换
  • 您使用了
    H
    而不是
    H
    来解析带有AM/PM标记的日期时间字符串。符号
    H
    用于解析24小时格式的时间字符串。另一个<强>重要的要点< /强>考虑的是,PM在 LoaLe>加拿大< /代码>中被写为<代码>下午>代码>。对于您的时间字符串,您可以使用
    Locale.US
    将其指定为PM
  • 因此,您可以使用如下所示的解析器:

    new SimpleDateFormat("M/d/u h:m:s a", Locale.US)
    
    其中,
    a
    已用于解析AM/PM

    使用此解析器可以解决您的问题,但传统的日期时间API(
    java.util
    date-time类型及其格式化API,
    SimpleDateFormat
    )已经过时且容易出错。建议完全停止使用它,并切换到
    java.time
    ,即*

    使用现代日期时间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
    
    输出:

    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
    
    了解有关*的更多信息


    *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。 不幸的是,我们也错了

    您在分析过程中犯了两个错误:

  • 您已将
    MM
    dd
    交换
  • 您使用了
    H
    而不是
    H
    来解析带有AM/PM标记的日期时间字符串。符号
    H
    用于解析24小时格式的时间字符串。另一个<强>重要的要点< /强>考虑的是,PM在 LoaLe>加拿大< /代码>中被写为<代码>下午>代码>。对于您的时间字符串,您可以使用
    Locale.US
    将其指定为PM
  • 因此,您可以使用如下所示的解析器:

    new SimpleDateFormat("M/d/u h:m:s a", Locale.US)
    
    其中,
    a
    已用于解析AM/PM

    使用此解析器可以解决您的问题,但传统的日期时间API(
    java.util
    date-time类型及其格式化API,
    SimpleDateFormat
    )已经过时且容易出错。建议完全停止使用它,并切换到
    java.time
    ,即*

    使用现代日期时间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
    
    输出:

    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
    
    了解有关*的更多信息


    *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

    “MM/dd/yyyy HH:MM:ss”不是“03/19/2014 5:30:10 PM”的格式。结果仍然错误,这个时间月=2它应该是月=3你对我的代码进行格式化是什么意思。。?我已经将格式化程序更改为DateFormat df=new SimpleDateFormat(“MM/dd/yyyy HH:MM:ss aa”,Locale.CANADA);“MM/dd/yyyy HH:MM:ss”不是“03/19/2014 5:30:10 PM”的格式。结果仍然错误,这个时间月=2应该是月=3。您对我的代码进行格式化是什么意思。。?我已经将格式化程序更改为DateFormat df=new SimpleDateFormat(“MM/dd/yyyy HH:MM:ss aa”,Locale.CANADA);我也尝试过,但仍然是一个错误的输出,它给了我一个月=21我已经将我的格式化程序更改为DateFormat df=new SimpleDateFormat(“MM/dd/yyyy HH:MM:ss aa”,Locale.CANADA);
    Month
    索引和
    1
    被浓缩为
    String
    ,这就是为什么输出是
    21
    。这是我的错误,我没有添加括号。我也尝试了,但仍然是一个错误的输出,它给了我一个Month=21i我已经将我的格式化程序更改为DateFormat df=new SimpleDateFormat(“MM/dd/yyyy HH:MM:ss aa”,地点:加拿大);
    Month
    索引和
    1
    被浓缩为
    String
    ,这就是为什么输出是
    21
    。这是我的错误,我没有添加括号。记住c.get(Calendar.Month)是基于零的(即一月是0月,等等)。记住c.get(Calendar.Month)是基于零的(即一月是0月,等等)。