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在Locale.US
将其指定为PMnew 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在Locale.US
将其指定为PMnew 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月,等等)。