如何在Java中获取两个日期之间的月份列表

huangapple go评论104阅读模式
英文:

How to get list of months between two dates in Java

问题

以下是您提供的代码的翻译部分:

  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. public class Main {
  6. public static void main(String[] args) {
  7. String date1 = "3/17/2020";
  8. String date2 = "3/17/2021";
  9. DateFormat formater = new SimpleDateFormat("MM/dd/yyyy");
  10. Calendar beginCalendar = Calendar.getInstance();
  11. Calendar finishCalendar = Calendar.getInstance();
  12. try {
  13. beginCalendar.setTime(formater.parse(date1));
  14. finishCalendar.setTime(formater.parse(date2));
  15. } catch (ParseException e) {
  16. e.printStackTrace();
  17. }
  18. DateFormat formaterYd = new SimpleDateFormat("01-MMM-yyyy");
  19. while (beginCalendar.before(finishCalendar)) {
  20. // add one month to date per loop
  21. String date = formaterYd.format(beginCalendar.getTime()).toUpperCase();
  22. System.out.println(date);
  23. beginCalendar.add(Calendar.MONTH, 1);
  24. }
  25. }
  26. }

希望这对您有所帮助!如果您有任何问题,请随时问我。

英文:

I am trying to get a list of months (actually the first days of those months) between two dates in Java but I am not getting the expected results.

The start date is "3/17/2020", the end date "3/17/2021" and the expected result is as follows:

  1. "01-Mar-2020"
  2. "01-Apr-2020"
  3. "01-May-2020"
  4. "01-Jun-2020"
  5. "01-Jul-2020"
  6. "01-Aug-2020"
  7. "01-Sep-2020"
  8. "01-Oct-2020"
  9. "01-Nov-2020"
  10. "01-Dec-2020"
  11. "01-Jan-2021"
  12. "01-Feb-2021"
  13. "01-Mar-2021"

Here below is the code I am using:

  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. public class Main {
  6. public static void main(String[] args) {
  7. String date1 = "3/17/2020";
  8. String date2 = "3/17/2021";
  9. DateFormat formater = new SimpleDateFormat("MM/dd/yyyy");
  10. Calendar beginCalendar = Calendar.getInstance();
  11. Calendar finishCalendar = Calendar.getInstance();
  12. try {
  13. beginCalendar.setTime(formater.parse(date1));
  14. finishCalendar.setTime(formater.parse(date2));
  15. } catch (ParseException e) {
  16. e.printStackTrace();
  17. }
  18. DateFormat formaterYd = new SimpleDateFormat("01-MMM-YYYY");
  19. while (beginCalendar.before(finishCalendar)) {
  20. // add one month to date per loop
  21. String date = formaterYd.format(beginCalendar.getTime()).toUpperCase();
  22. System.out.println(date);
  23. beginCalendar.add(Calendar.MONTH, 1);
  24. }
  25. }
  26. }

With the above code I am getting the following result:

  1. "01-Jan-2020"
  2. "01-Feb-2020"
  3. "01-Mar-2020"
  4. "01-Apr-2020"
  5. "01-May-2020"
  6. "01-Jun-2020"
  7. "01-Jul-2020"
  8. "01-Aug-2020"
  9. "01-Sep-2020"
  10. "01-Oct-2020"
  11. "01-Nov-2020"
  12. "01-Dec-2020"

Please help me understand the issue and suggest any solution for the same with java 7.

答案1

得分: 7

以下是翻译好的内容:

  1. 我建议您使用[现代](https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html)的 `java.time` 日期时间 API 和相应的格式化 API(包:`java.time.format`)来完成此操作。您可以从**[教程:日期时间](https://docs.oracle.com/javase/tutorial/datetime/index.html)**中了解有关现代日期时间 API 的更多信息。`java.util` 日期时间 API 和 `SimpleDateFormat` 已过时且容易出错。如果您未使用 Java 8,仍可以通过 [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP) 库使用 Java 8 日期时间 API。
  2. 如果您在 Android 上进行操作且您的 Android API 级别仍不符合 Java 8可以查看[通过解糖获得的 Java 8+ API](https://developer.android.com/studio/write/java8-support-table)。
  3. import java.time.LocalDate;
  4. import java.time.format.DateTimeFormatter;
  5. import java.time.temporal.ChronoUnit;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9. public class Main {
  10. public static void main(String[] args) {
  11. // 测试
  12. System.out.println(getDateList("3/17/2020", "3/17/2021"));
  13. }
  14. static List<String> getDateList(String strStartDate, String strEndDate) {
  15. // 输入格式化器
  16. DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("M/d/u");
  17. // 输出格式化器
  18. DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd-MMM-uuuu");
  19. // 将字符串解析为 LocalDate 实例
  20. LocalDate startDate = LocalDate.parse(strStartDate, inputFormatter);
  21. LocalDate endDate = LocalDate.parse(strEndDate, inputFormatter);
  22. return Stream.iterate(startDate.withDayOfMonth(1), date -> date.plusMonths(1))
  23. .limit(ChronoUnit.MONTHS.between(startDate, endDate.plusMonths(1)))
  24. .map(date -> date.format(outputFormatter))
  25. .collect(Collectors.toList());
  26. }
  27. }
  28. **输出:**
  29. [01-Mar-2020, 01-Apr-2020, 01-May-2020, 01-Jun-2020, 01-Jul-2020, 01-Aug-2020, 01-Sep-2020, 01-Oct-2020, 01-Nov-2020, 01-Dec-2020, 01-Jan-2021, 01-Feb-2021, 01-Mar-2021]
  30. ## 使用旧版 API:
  31. import java.text.DateFormat;
  32. import java.text.ParseException;
  33. import java.text.SimpleDateFormat;
  34. import java.util.ArrayList;
  35. import java.util.Calendar;
  36. import java.util.Date;
  37. import java.util.List;
  38. public class Main {
  39. public static void main(String[] args) throws ParseException {
  40. // 测试
  41. System.out.println(getDateList("3/17/2020", "3/17/2021"));
  42. }
  43. static List<String> getDateList(String strStartDate, String strEndDate) throws ParseException {
  44. // 要填充和返回的列表
  45. List<String> dateList = new ArrayList<>();
  46. // 输入格式化器
  47. DateFormat inputFormatter = new SimpleDateFormat("M/d/yyyy");
  48. // 输出格式化器
  49. DateFormat outputFormatter = new SimpleDateFormat("dd-MMM-yyyy");
  50. // 将字符串解析为 Date 实例
  51. Date startDate = inputFormatter.parse(strStartDate);
  52. Date endDate = inputFormatter.parse(strEndDate);
  53. // 起始的日历
  54. Calendar startWith = Calendar.getInstance();
  55. startWith.setTime(startDate);
  56. startWith.set(Calendar.DAY_OF_MONTH, 1);
  57. for (Calendar calendar = startWith; calendar.getTime().getTime() <= endDate.getTime(); calendar
  58. .add(Calendar.MONTH, 1)) {
  59. dateList.add(outputFormatter.format(calendar.getTime()));
  60. }
  61. return dateList;
  62. }
  63. }
  64. **输出:**
  65. [01-Mar-2020, 01-Apr-2020, 01-May-2020, 01-Jun-2020, 01-Jul-2020, 01-Aug-2020, 01-Sep-2020, 01-Oct-2020, 01-Nov-2020, 01-Dec-2020, 01-Jan-2021, 01-Feb-2021, 01-Mar-2021]
英文:

I recommend you do it using the modern java.time date-time API and the corresponding formatting API (package, java.time.format). Learn more about the modern date-time API from Trail: Date Time. The java.util date-time API and SimpleDateFormat are outdated and error-prone. In case you are not using Java-8, you can still use Java-8 date-time API through ThreeTenABP library.

If you are doing it in Android and your Android API level is still not compliant with Java8, check Java 8+ APIs available through desugaring.

  1. import java.time.LocalDate;
  2. import java.time.format.DateTimeFormatter;
  3. import java.time.temporal.ChronoUnit;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. import java.util.stream.Stream;
  7. public class Main {
  8. public static void main(String[] args) {
  9. // Test
  10. System.out.println(getDateList(&quot;3/17/2020&quot;, &quot;3/17/2021&quot;));
  11. }
  12. static List&lt;String&gt; getDateList(String strStartDate, String strEndDate) {
  13. // Formatter for the input
  14. DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(&quot;M/d/u&quot;);
  15. // Formatter for the output
  16. DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(&quot;dd-MMM-uuuu&quot;);
  17. // Parse strings to LocalDate instances
  18. LocalDate startDate = LocalDate.parse(strStartDate, inputFormatter);
  19. LocalDate endDate = LocalDate.parse(strEndDate, inputFormatter);
  20. return Stream.iterate(startDate.withDayOfMonth(1), date -&gt; date.plusMonths(1))
  21. .limit(ChronoUnit.MONTHS.between(startDate, endDate.plusMonths(1)))
  22. .map(date -&gt; date.format(outputFormatter))
  23. .collect(Collectors.toList());
  24. }
  25. }

Output:

  1. [01-Mar-2020, 01-Apr-2020, 01-May-2020, 01-Jun-2020, 01-Jul-2020, 01-Aug-2020, 01-Sep-2020, 01-Oct-2020, 01-Nov-2020, 01-Dec-2020, 01-Jan-2021, 01-Feb-2021, 01-Mar-2021]

Using legacy API:

  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.List;
  8. public class Main {
  9. public static void main(String[] args) throws ParseException {
  10. // Test
  11. System.out.println(getDateList(&quot;3/17/2020&quot;, &quot;3/17/2021&quot;));
  12. }
  13. static List&lt;String&gt; getDateList(String strStartDate, String strEndDate) throws ParseException {
  14. // List to be populated and returned
  15. List&lt;String&gt; dateList = new ArrayList&lt;&gt;();
  16. // Formatter for the input
  17. DateFormat inputFormatter = new SimpleDateFormat(&quot;M/d/yyyy&quot;);
  18. // Formatter for the output
  19. DateFormat outputFormatter = new SimpleDateFormat(&quot;dd-MMM-yyyy&quot;);
  20. // Parse strings to LocalDate instances
  21. Date startDate = inputFormatter.parse(strStartDate);
  22. Date endDate = inputFormatter.parse(strEndDate);
  23. // Calendar to start with
  24. Calendar startWith = Calendar.getInstance();
  25. startWith.setTime(startDate);
  26. startWith.set(Calendar.DAY_OF_MONTH, 1);
  27. for (Calendar calendar = startWith; calendar.getTime().getTime() &lt;= endDate.getTime(); calendar
  28. .add(Calendar.MONTH, 1)) {
  29. dateList.add(outputFormatter.format(calendar.getTime()));
  30. }
  31. return dateList;
  32. }
  33. }

Output:

  1. [01-Mar-2020, 01-Apr-2020, 01-May-2020, 01-Jun-2020, 01-Jul-2020, 01-Aug-2020, 01-Sep-2020, 01-Oct-2020, 01-Nov-2020, 01-Dec-2020, 01-Jan-2021, 01-Feb-2021, 01-Mar-2021]

答案2

得分: 4

  1. **Java7** 解决方案
  2. public static void main(String[] args) throws ParseException {
  3. DateFormat df1 = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
  4. Date dateFrom = df1.parse("3/17/2020");
  5. Date dateTo = df1.parse("3/17/2021");
  6. final Locale locale = Locale.US;
  7. DateFormat df2 = new SimpleDateFormat("MMM-yyyy", Locale.US);
  8. List<String> months = getListMonths(dateFrom, dateTo, locale, df2);
  9. for (String month : months)
  10. System.out.println(month.toUpperCase(locale));
  11. }
  12. public static List<String> getListMonths(Date dateFrom, Date dateTo, Locale locale, DateFormat df) {
  13. Calendar calendar = Calendar.getInstance(locale);
  14. calendar.setTime(dateFrom);
  15. List<String> months = new ArrayList<>();
  16. while (calendar.getTime().getTime() <= dateTo.getTime()) {
  17. months.add(df.format(calendar.getTime()));
  18. calendar.add(Calendar.MONTH, 1);
  19. }
  20. return months;
  21. }
  22. **Output:**
  23. MAR-2020
  24. APR-2020
  25. MAY-2020
  26. JUN-2020
  27. JUL-2020
  28. AUG-2020
  29. SEP-2020
  30. OCT-2020
  31. NOV-2020
  32. DEC-2020
  33. JAN-2021
  34. FEB-2021
  35. MAR-2021
英文:

Java7 soulution:

  1. public static void main(String[] args) throws ParseException {
  2. DateFormat df1 = new SimpleDateFormat(&quot;MM/dd/yyyy&quot;, Locale.US);
  3. Date dateFrom = df1.parse(&quot;3/17/2020&quot;);
  4. Date dateTo = df1.parse(&quot;3/17/2021&quot;);
  5. final Locale locale = Locale.US;
  6. DateFormat df2 = new SimpleDateFormat(&quot;MMM-yyyy&quot;, Locale.US);
  7. List&lt;String&gt; months = getListMonths(dateFrom, dateTo, locale, df2);
  8. for (String month : months)
  9. System.out.println(month.toUpperCase(locale));
  10. }
  11. public static List&lt;String&gt; getListMonths(Date dateFrom, Date dateTo, Locale locale, DateFormat df) {
  12. Calendar calendar = Calendar.getInstance(locale);
  13. calendar.setTime(dateFrom);
  14. List&lt;String&gt; months = new ArrayList&lt;&gt;();
  15. while (calendar.getTime().getTime() &lt;= dateTo.getTime()) {
  16. months.add(df.format(calendar.getTime()));
  17. calendar.add(Calendar.MONTH, 1);
  18. }
  19. return months;
  20. }

Output:

  1. MAR-2020
  2. APR-2020
  3. MAY-2020
  4. JUN-2020
  5. JUL-2020
  6. AUG-2020
  7. SEP-2020
  8. OCT-2020
  9. NOV-2020
  10. DEC-2020
  11. JAN-2021
  12. FEB-2021
  13. MAR-2021

答案3

得分: 3

使用 java.time.LocalDate

  1. public static List<LocalDate> diff(LocalDate start, LocalDate end) {
  2. return start
  3. .datesUntil(end)
  4. .filter(e -> e.getDayOfMonth() == 1)
  5. .collect(Collectors.toList());
  6. }
  7. diff(LocalDate.now(), LocalDate.of(2020, 12, 20))

输出:

  1. [2020-10-01, 2020-11-01, 2020-12-01]

您可以使用 DateTimeFormatter 字符串日期与 LocalDate 相互转换。

编辑
仅使用 Java 7(对问题中的代码进行了修改):

  1. public static void main(String[] args) throws IOException {
  2. String date1 = "3/17/2020";
  3. String date2 = "3/17/2021";
  4. DateFormat formater = new SimpleDateFormat("MM/dd/yyyy");
  5. Calendar beginCalendar = Calendar.getInstance();
  6. Calendar finishCalendar = Calendar.getInstance();
  7. try {
  8. beginCalendar.setTime(formater.parse(date1));
  9. finishCalendar.setTime(formater.parse(date2));
  10. } catch (ParseException e) {
  11. e.printStackTrace();
  12. }
  13. DateFormat formaterYd = new SimpleDateFormat("dd-MMM-YYYY");
  14. // 注意在 while 中的条件
  15. while (beginCalendar.compareTo(finishCalendar) <= 0) {
  16. Calendar tmp = (Calendar)beginCalendar.clone();
  17. tmp.set(Calendar.DAY_OF_MONTH, 1);
  18. String date = formaterYd.format(tmp.getTime()).toUpperCase();
  19. System.out.println(date);
  20. beginCalendar.add(Calendar.MONTH, 1);
  21. }
  22. }
英文:

Using java.time.LocalDate:

  1. public static List&lt;LocalDate&gt; diff(LocalDate start, LocalDate end) {
  2. return start
  3. .datesUntil(end)
  4. .filter(e -&gt; e.getDayOfMonth() == 1)
  5. .collect(Collectors.toList());
  6. }
  7. diff(LocalDate.now(), LocalDate.of(2020, 12, 20))

Output:

  1. [2020-10-01, 2020-11-01, 2020-12-01]

You can use DateTimeFormatter string date to LocalDate and vice-versa.

EDIT
Using java 7 only (modified given code in question):

  1. public static void main(String[] args) throws IOException {
  2. String date1 = &quot;3/17/2020&quot;;
  3. String date2 = &quot;3/17/2021&quot;;
  4. DateFormat formater = new SimpleDateFormat(&quot;MM/dd/yyyy&quot;);
  5. Calendar beginCalendar = Calendar.getInstance();
  6. Calendar finishCalendar = Calendar.getInstance();
  7. try {
  8. beginCalendar.setTime(formater.parse(date1));
  9. finishCalendar.setTime(formater.parse(date2));
  10. } catch (ParseException e) {
  11. e.printStackTrace();
  12. }
  13. DateFormat formaterYd = new SimpleDateFormat(&quot;dd-MMM-YYYY&quot;);
  14. // mind this condition in while
  15. while (beginCalendar.compareTo(finishCalendar) &lt;= 0) {
  16. Calendar tmp = (Calendar)beginCalendar.clone();
  17. tmp.set(Calendar.DAY_OF_MONTH, 1);
  18. String date = formaterYd.format(tmp.getTime()).toUpperCase();
  19. System.out.println(date);
  20. beginCalendar.add(Calendar.MONTH, 1);
  21. }
  22. }

huangapple
  • 本文由 发表于 2020年9月17日 15:48:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/63933494.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定