如何使用Java在两个日期之间获取月份名称

时间:2015-12-23 11:06:08

标签: java date

我正在尝试以“01/01/201412/28/2014”的格式查找MMMYY的月份名称。但是我得到了以下输出。

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

先谢谢。

2 个答案:

答案 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.time

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.ENGLISHLocale.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确实是isEqualisAfter(不是isBefore)的起始者。您可以通过将YearMonth.from ( stop )的结果保存在变量中而不是在循环中重复调用来优化一点,但除非您经常使用此代码非常,否则我不会打扰 - 并且JVM可能会自动为您优化。