我的代码出了什么问题?我无法从要解析的日期时间中获得确切的输出?
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();
}
不幸的是,接受的答案和其他答案都是错误的。
你在解析中犯了两个错误:
- 您已将
MM
替换为dd
- 您已使用
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 Backport将Java.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API。