Java 计算日期之间 天数 周数 月数 年数 列表

红太狼 2022-08-09 18:56 439阅读 0赞
  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import java.util.List;
  7. public class DateUtil {
  8. public static final String YYYYMM = "yyyy-MM";
  9. public static final String YYYYMMDD = "yyyy-MM-dd";
  10. public static final String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss";
  11. /**
  12. * 获取两个时间中连续日期-包含开始时间结束时间所在日期
  13. *
  14. * @param startDay yyyy-MM-dd
  15. * @param endDay yyyy-MM-dd
  16. * @return
  17. */
  18. public static List<String> getDayList(String startDay, String endDay) {
  19. List<String> result = new ArrayList<>();
  20. result.add(startDay.substring(0, 10));
  21. if (startDay.equals(endDay)) {
  22. return result;
  23. }
  24. Calendar tempStart = Calendar.getInstance();
  25. tempStart.setTime(parseDate(startDay, null));
  26. tempStart.add(Calendar.DAY_OF_YEAR, 1);
  27. Calendar tempEnd = Calendar.getInstance();
  28. tempEnd.setTime(parseDate(endDay, null));
  29. while (tempStart.before(tempEnd)) {
  30. result.add(new SimpleDateFormat("yyyy-MM-dd").format(tempStart.getTime()));
  31. tempStart.add(Calendar.DAY_OF_YEAR, 1);
  32. }
  33. result.add(endDay.substring(0, 10));
  34. return result;
  35. }
  36. /**
  37. * 获取两个时间中连续周数-包含开始时间结束时间所在周数
  38. *
  39. * @param startWeek yyyy-0~53
  40. * @param endWeek yyyy-1~53
  41. * @return
  42. */
  43. public static List<String> getWeekList(String startWeek, String endWeek) {
  44. List<String> result = new ArrayList<>();
  45. int sYear = Integer.parseInt(startWeek.substring(0, 4));// 开始年数
  46. int sWeek = Integer.parseInt(startWeek.substring(5, 7));// 开始周数
  47. int eYear = Integer.parseInt(endWeek.substring(0, 4));// 结束年数
  48. int eWeek = Integer.parseInt(endWeek.substring(5, 7));// 结束周数
  49. if (sYear == eYear) {// 开始、结束年数为同一年
  50. while (sWeek <= eWeek) {
  51. result.add(sYear + "-" + formatIntStr(sWeek));
  52. sWeek = sWeek + 1;
  53. }
  54. } else {// 开始、结束年数非同一年
  55. int sYearWeekNum = weekNumOfYear(sYear);// 开始年周总数
  56. while (sWeek <= sYearWeekNum) {// 开始年周数信息
  57. result.add(sYear + "-" + formatIntStr(sWeek));
  58. sWeek = sWeek + 1;
  59. }
  60. if ((eYear - sYear) > 1) {// 开始、结束年间隔大于 1
  61. sYear = sYear + 1;
  62. while (sYear < eYear) {
  63. int tempWeekNum = weekNumOfYear(sYear);// 间隔年周总数
  64. for (int i = 1; i <= tempWeekNum; i++) {
  65. result.add(sYear + "-" + formatIntStr(i));
  66. }
  67. sYear = sYear + 1;
  68. }
  69. }
  70. for (int i = 1; i <= eWeek; i++) {
  71. result.add(eYear + "-" + formatIntStr(i));
  72. }
  73. }
  74. return result;
  75. }
  76. /**
  77. * 获取两个时间中连续月份-包含开始时间结束时间所在月份
  78. *
  79. * @param startMonth yyyy-MM
  80. * @param endMonth yyyy-MM
  81. * @return
  82. */
  83. public static List<String> getMonthList(String startMonth, String endMonth) {
  84. ArrayList<String> result = new ArrayList<>();
  85. try {
  86. SimpleDateFormat sdf = new SimpleDateFormat(YYYYMM);//格式化为年月
  87. Calendar min = Calendar.getInstance();
  88. Calendar max = Calendar.getInstance();
  89. min.setTime(sdf.parse(startMonth));
  90. min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
  91. max.setTime(sdf.parse(endMonth));
  92. max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
  93. Calendar curr = min;
  94. while (curr.before(max)) {
  95. result.add(sdf.format(curr.getTime()));
  96. curr.add(Calendar.MONTH, 1);
  97. }
  98. } catch (ParseException e) {
  99. e.printStackTrace();
  100. }
  101. return result;
  102. }
  103. /**
  104. * 获取两个时间中连续年份-包含开始时间结束时间所在年份
  105. *
  106. * @param startYear yyyy
  107. * @param endYear yyyy
  108. * @return
  109. */
  110. public static List<String> getYearList(String startYear, String endYear) {
  111. ArrayList<String> result = new ArrayList<>();
  112. int start = Integer.parseInt(startYear);
  113. int end = Integer.parseInt(endYear);
  114. result.add(startYear);
  115. while (start < end) {
  116. start++;
  117. result.add(String.valueOf(start));
  118. }
  119. return result;
  120. }
  121. /**
  122. * 时间字符串转换为时间
  123. *
  124. * @param strDate
  125. * @param pattern
  126. * @return
  127. */
  128. public static Date parseDate(String strDate, String pattern) {
  129. Date date = null;
  130. try {
  131. if (pattern == null) {
  132. pattern = YYYYMMDD;
  133. }
  134. SimpleDateFormat format = new SimpleDateFormat(pattern);
  135. date = format.parse(strDate);
  136. } catch (Exception e) {
  137. e.printStackTrace();
  138. }
  139. return date;
  140. }
  141. /**
  142. * 获取一年周数
  143. *
  144. * @param year
  145. * @return
  146. */
  147. public static int weekNumOfYear(int year) {
  148. int weekNum = 0;
  149. int days = 365;
  150. int day = 0; // 判断是否闰年,闰年366天
  151. if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
  152. days = 366;
  153. }
  154. // 得到一年所有天数然后除以7
  155. day = days % 7 > 0 ? weekNum += 1 : weekNum;
  156. // 得到余下几天如果有余则周+1,否则不加
  157. weekNum += days / 7;
  158. //得到多少周
  159. return weekNum;
  160. }
  161. /**
  162. * 小于 10 数字前补 0
  163. *
  164. * @param formatInt
  165. * @return
  166. */
  167. public static String formatIntStr(int formatInt) {
  168. if (formatInt > 9) {
  169. return "" + formatInt;
  170. } else {
  171. return "0" + formatInt;
  172. }
  173. }
  174. public static void main(String[] args) {
  175. getDayList("2019-12-25", "2020-01-01").stream().forEach(str -> System.out.println(str));
  176. getWeekList("2018-50", "2020-05").stream().forEach(str -> System.out.println(str));
  177. getMonthList("2019-12", "2020-05").stream().forEach(str -> System.out.println(str));
  178. getYearList("2001", "2020").stream().forEach(str -> System.out.println(str));
  179. }
  180. }

Mybatis 统计代码:

  1. <select id="dayReportForm" resultType="java.util.Map">
  2. SELECT
  3. date_format(team.dispatch_time, '%Y-%m-%d') AS dayTime,
  4. COUNT(*) AS teamCountNum
  5. FROM
  6. fire_warn_team_rel AS team
  7. WHERE 1 = 1
  8. <if test="startTime != null and startTime != ''">
  9. AND date_format(team.dispatch_time, '%Y-%m-%d') <![CDATA[ >= ]]> #{startTime}
  10. </if>
  11. <if test="endTime != null and endTime != ''">
  12. AND date_format(team.dispatch_time, '%Y-%m-%d') <![CDATA[ <= ]]> #{endTime}
  13. </if>
  14. <if test="limitStart != null and limitStart != ''">
  15. AND date_format(team.dispatch_time, '%Y-%m-%d') <![CDATA[ >= ]]> #{limitStart}
  16. </if>
  17. <if test="limitEnd != null and limitEnd != ''">
  18. AND date_format(team.dispatch_time, '%Y-%m-%d') <![CDATA[ <= ]]> #{limitEnd}
  19. </if>
  20. GROUP BY
  21. date_format(team.dispatch_time, '%Y-%m-%d');
  22. </select>
  23. <select id="weekReportForm" resultType="java.util.Map">
  24. SELECT
  25. yearweek(team.dispatch_time, 3) AS weekTime,
  26. COUNT(*) AS teamCountNum
  27. FROM
  28. fire_warn_team_rel AS team
  29. WHERE 1 = 1
  30. <if test="startTime != null and startTime != ''">
  31. AND yearweek(team.dispatch_time, 3) <![CDATA[ >= ]]> #{startTime}
  32. </if>
  33. <if test="endTime != null and endTime != ''">
  34. AND yearweek(team.dispatch_time, 3) <![CDATA[ <= ]]> #{endTime}
  35. </if>
  36. <if test="limitStart != null and limitStart != ''">
  37. AND yearweek(team.dispatch_time, 3) <![CDATA[ >= ]]> #{limitStart}
  38. </if>
  39. <if test="limitEnd != null and limitEnd != ''">
  40. AND yearweek(team.dispatch_time, 3) <![CDATA[ <= ]]> #{limitEnd}
  41. </if>
  42. GROUP BY
  43. yearweek(team.dispatch_time, 3);
  44. </select>
  45. <select id="monthReportForm" resultType="java.util.Map">
  46. SELECT
  47. date_format(team.dispatch_time, '%Y-%m') AS monthTime,
  48. COUNT(*) AS teamCountNum
  49. FROM
  50. fire_warn_team_rel AS team
  51. WHERE 1 = 1
  52. <if test="startTime != null and startTime != ''">
  53. AND date_format(team.dispatch_time, '%Y-%m') <![CDATA[ >= ]]> #{startTime}
  54. </if>
  55. <if test="endTime != null and endTime != ''">
  56. AND date_format(team.dispatch_time, '%Y-%m') <![CDATA[ <= ]]> #{endTime}
  57. </if>
  58. <if test="limitStart != null and limitStart != ''">
  59. AND date_format(team.dispatch_time, '%Y-%m') <![CDATA[ >= ]]> #{limitStart}
  60. </if>
  61. <if test="limitEnd != null and limitEnd != ''">
  62. AND date_format(team.dispatch_time, '%Y-%m') <![CDATA[ <= ]]> #{limitEnd}
  63. </if>
  64. GROUP BY
  65. date_format(team.dispatch_time, '%Y-%m');
  66. </select>
  67. <select id="yearReportForm" resultType="java.util.Map">
  68. SELECT
  69. date_format(team.dispatch_time, '%Y') AS yearTime,
  70. COUNT(*) AS teamCountNum
  71. FROM
  72. fire_warn_team_rel AS team
  73. WHERE 1 = 1
  74. <if test="startTime != null and startTime != ''">
  75. AND date_format(team.dispatch_time, '%Y') <![CDATA[ >= ]]> #{startTime}
  76. </if>
  77. <if test="endTime != null and endTime != ''">
  78. AND date_format(team.dispatch_time, '%Y') <![CDATA[ <= ]]> #{endTime}
  79. </if>
  80. <if test="limitStart != null and limitStart != ''">
  81. AND date_format(team.dispatch_time, '%Y') <![CDATA[ >= ]]> #{limitStart}
  82. </if>
  83. <if test="limitEnd != null and limitEnd != ''">
  84. AND date_format(team.dispatch_time, '%Y') <![CDATA[ <= ]]> #{limitEnd}
  85. </if>
  86. GROUP BY
  87. date_format(team.dispatch_time, '%Y');
  88. </select>

发表评论

表情:
评论列表 (有 0 条评论,439人围观)

还没有评论,来说两句吧...

相关阅读