我正在尝试以“01/01/2014
,12/28/2014
”的格式查找MMM
到YY
的月份名称。但是我得到了以下输出。
DEC, 14.
JAN, 14.
FEB, 14.
MAR, 14.
APR, 14.
MAY, 14.
JUN, 14.
JUL, 14.
AUG, 14.
SEP, 14.
OCT, 14.
NOV, 14.
我需要这样的输出
Jan, 14
.......
.......
Dec, 14
任何人都可以帮忙解决这个问题。
这是我的代码。
String date1 = "01/01/2014";
String date2 = "12/28/2014";
final String OLD_FORMAT = "MM/dd/yyyy";
final String NEW_FORMAT = "MMM, YY";
SimpleDateFormat newFormat = new SimpleDateFormat(OLD_FORMAT);
Date fromDate = newFormat.parse(date1);
Date toDate = newFormat.parse(date2);
newFormat.applyPattern(NEW_FORMAT);
String newFromDate = newFormat.format(fromDate);
String newToDate = newFormat.format(toDate);
//System.out.println(newFromDate);
//System.out.println(newToDate);
DateFormat formater = new SimpleDateFormat(NEW_FORMAT);
Calendar beginCalendar = Calendar.getInstance();
Calendar finishCalendar = Calendar.getInstance();
try {
beginCalendar.setTime(formater.parse(newFromDate));
finishCalendar.setTime(formater.parse(newToDate));
} catch (ParseException e) {
e.printStackTrace();
}
String date;
while (beginCalendar.before(finishCalendar)) {
// add one month to date per loop
date = formater.format(beginCalendar.getTime()).toUpperCase();
System.out.println(date);
beginCalendar.add(Calendar.MONTH, 1);
}
先谢谢。
答案 0 :(得分:0)
您可以尝试:
String date1 = "01/01/2014";
String date2 = "12/28/2014";
final String OLD_FORMAT = "MM/dd/yyyy";
final String NEW_FORMAT = "MMM, YY";
SimpleDateFormat newFormat = new SimpleDateFormat(OLD_FORMAT);
DateFormat formatter = new SimpleDateFormat(NEW_FORMAT);
Date fromDate = newFormat.parse(date1);
Date toDate = newFormat.parse(date2);
Calendar beginCalendar = Calendar.getInstance();
Calendar finishCalendar = Calendar.getInstance();
beginCalendar.setTimeInMillis(fromDate.getTime());
finishCalendar.setTimeInMillis(toDate.getTime());
String date;
while (beginCalendar.before(finishCalendar)) {
// add one month to date per loop
date = formatter.format(beginCalendar.getTime());
System.out.println(date);
beginCalendar.add(Calendar.MONTH, 1);
}
答案 1 :(得分:0)
Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
新课程包括LocalDate
,用于处理仅限日期的值 sans 时间和时区。从那里开始,我们将使用YearMonth
个对象,因为您感兴趣,年,月。
首先将两个字符串解析为一对LocalDate
个实例。
String inputStart = "01/01/2014";
String inputStop = "12/28/2014";
DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern ( "MM/dd/yyyy" );
LocalDate start = LocalDate.parse ( inputStart , formatterInput );
LocalDate stop = LocalDate.parse ( inputStop , formatterInput );
我们将生成YearMonth
个对象的String表示。 YearMonth::toString
方法的默认格式是标准ISO 8601格式,YYYY-MM。我强烈建议在可行的情况下使用这些格式。但是您的问题指定了不同的格式,因此我们必须定义自定义格式化程序模式。
请注意明确的Locale
对象,例如Locale.ENGLISH
或Locale.CANADA_FRENCH
。如果省略,则JVM的当前默认语言环境将隐式应用于本地化月份名称。默认情况下可以随时更改在运行时,因此我建议您始终指定所需/预期的区域设置。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMM yyyy" , Locale.ENGLISH ); // Or Locale.CANADA_FRENCH etc.
不要使用System.out.println
,而是在List
中收集每个月的字符串输出。
List<String> outputs = new ArrayList<> ();
为我们的起始LocalDate实例化YearMonth
。
YearMonth yearMonth = YearMonth.from ( start );
从该起始年份开始,循环一系列YearMonth对象,生成该年 - 月值的String表示。继续循环,直到我们超过结束LocalDate
的年 - 月。在每个循环中,我们通过调用plusMonths
来增加。
// Repeat while the current year-month is *not* after (is before or is equal) the ending year-month.
while ( ! yearMonth.isAfter ( YearMonth.from ( stop ) ) ) {
//String output = yearMonth.toString (); // ISO 8601 format.
String output = yearMonth.format ( formatter );
outputs.add ( output );
// Prepare for next loop.
yearMonth = yearMonth.plusMonths ( 1 );
}
转储到控制台。
System.out.println ( "Months from start: " + start + " to stop: " + stop + " is: " + outputs );
从开始的几个月:2014-01-01停止:2014-12-28是:[2014年1月,2014年2月,2014年3月,2014年4月,2014年5月,2014年6月,2014年7月,2014年8月,2014年9月, 2014年10月,2014年11月,2014年12月]
我强烈建议不要使用两位数的年份数作为输出。我发现这样的缩写年份会导致业务混乱。但如果您坚持,请将模式从yy
调整为yyyy
。
提示:由于YearMonth
内置于Java 8及更高版本中,我建议在整个代码中使用此类的对象,如果您使用年月值执行更多操作,而不仅仅是转储在问题中看到的月份名称。
此代码可以更加健壮。例如,检查结束的LocalDate确实是isEqual
或isAfter
(不是isBefore
)的起始者。您可以通过将YearMonth.from ( stop )
的结果保存在变量中而不是在循环中重复调用来优化一点,但除非您经常使用此代码非常,否则我不会打扰 - 并且JVM可能会自动为您优化。