使用日历分析DateFormat中的日期时输出错误



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

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

从此更改日期格式

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));
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();
        }

不幸的是,接受的答案和其他答案都是错误的。

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

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

因此,您可以使用下面给出的解析器:

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

其中CCD_ 11已经被用于解析AM/PM。

使用此解析器可以解决您的问题,但传统的日期时间API(java.util日期时间类型及其格式API,SimpleDateFormat)已过时,并且是错误的。建议完全停止使用,并切换到java.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

跟踪:日期时间了解有关现代日期时间API*的更多信息。


*无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API。

相关内容

  • 没有找到相关文章

最新更新