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

如何使用Java获取两个日期之间的月份名称,java,date,Java,Date,我正在以“MMM,YY”的格式查找从2014年1月1日到2014年12月28日的月份名称。但是我得到了下面的输出 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

我正在以“
MMM
YY
”的格式查找从2014年1月1日
到2014年12月28日
的月份名称。但是我得到了下面的输出

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);
    }
提前谢谢。

您可以试试:

    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);
    }
你可以试试:

    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);
    }
java.time 内置于Java8和更高版本中的框架取代了麻烦的旧Java.util.Date/.Calendar类。新类的灵感来源于一个非常成功的框架,该框架旨在作为其继承者,在概念上类似,但经过了重新设计。定义为。由项目扩展。看

新类包括用于处理仅日期的值,而不包括一天中的时间和时区。从那里,我们将使用对象,因为你感兴趣的,嗯,年和月

首先将两个字符串解析为一对
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
对象的字符串表示形式。
YearMonth::toString
方法的默认格式是标准格式YYYY-MM。我强烈建议在可行的情况下使用这些格式。但您的问题指定了不同的格式,因此我们必须定义自定义格式化程序模式

注意显式的
Locale
对象,例如
Locale.ENGLISH
Locale.CANADA\u FRENCH
。如果省略,JVM的当前默认区域设置将隐式应用于本地化月份名称。默认设置可以在运行时随时更改,因此我建议始终指定所需/预期的区域设置

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMM yyyy" , Locale.ENGLISH );  // Or Locale.CANADA_FRENCH etc.
我们不使用
System.out.println
,而是在一个列表中收集每个月的字符串输出

从开始的yearMonth开始,循环yearMonth对象序列,生成该yearMonth值的字符串表示形式。继续循环,直到我们的增量超过结束日期
LocalDate
的年份月份。在每个循环中,我们通过调用

转储到控制台

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月]

我强烈建议不要使用两位数的年份数字作为输出。我发现这么短的年份会导致企业的混乱。但是如果您坚持,请将模式从
yyy
调整为
yy

提示:由于
YearMonth
内置于Java 8及更高版本中,如果您对年-月值做的更多,而不仅仅是像您的问题中所看到的那样转储月份名称,我建议在整个代码中使用此类对象

这段代码可以变得更加健壮。例如,检查结束的LocalDate是否确实是开始日期的
isEqual
isAfter
(而不是
isBefore
)。通过将
YearMonth.from(stop)
的结果保存在一个变量中,而不是在循环中重复调用,您可能可以进行一些优化,但我不会打扰您,除非您经常使用此代码,JVM可能会自动为您优化它。

java.time 内置于Java8和更高版本中的框架取代了麻烦的旧Java.util.Date/.Calendar类。新类的灵感来源于一个非常成功的框架,该框架旨在作为其继承者,在概念上类似,但经过了重新设计。定义为。由项目扩展。看

新类包括用于处理仅日期的值,而不包括一天中的时间和时区。从那里,我们将使用对象,因为你感兴趣的,嗯,年和月

首先将两个字符串解析为一对
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
对象的字符串表示形式。
YearMonth::toString
方法的默认格式是标准格式YYYY-MM。我强烈建议在可行的情况下使用这些格式。但您的问题指定了不同的格式,因此我们必须定义自定义格式化程序模式

注意显式的
Locale
对象,例如
Locale.ENGLISH
Locale.CANADA\u FRENCH
。如果省略,JVM的当前默认区域设置将隐式应用于本地化月份名称。默认设置可以在运行时随时更改,因此我建议始终指定所需/预期的区域设置

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMM yyyy" , Locale.ENGLISH );  // Or Locale.CANADA_FRENCH etc.
我们不使用
System.out.println
,而是在一个列表中收集每个月的字符串输出

从开始的yearMonth开始,循环yearMonth对象序列,生成该yearMonth值的字符串表示形式。继续循环,直到我们的增量超过结束日期
LocalDate
的年份月份。在每个循环中,我们通过调用

转储到控制台

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月]

我强烈建议不要使用两位数的年份数字作为输出。我发现这么短的年份会导致企业的混乱。但是如果您坚持,请将模式从
yyy
调整为
yy

提示:由于
YearMonth
内置于Java 8及更高版本中,如果您对年-月值做的更多,而不仅仅是像您的问题中所看到的那样转储月份名称,我建议在整个代码中使用此类对象

这段代码可以变得更加健壮。例如,检查结束的LocalDate是否确实是开始日期的
isEqual
isAfter
(而不是
isBefore
)。通过将
YearMonth.from(stop)
的结果保存在一个变量中,而不是在循环中重复调用,您可能可以进行一些优化,但我不会打扰您,除非您经常使用此代码,JVM可能会自动为您优化它。