经常会遇到在日志中显示时间范围,但是时间范围都是一堆毫秒单位的,自己心算下,这里简单做一个工具在打日志的时候,就将范围作为中文展示

示例:

  1. def "测试1"() {
  2. expect:
  3. Assert.assertEquals(result, TimeStrUtil.parseTime(time))
  4. where:
  5. time || result
  6. TimeUnit.MILLISECONDS.toMillis(1) || "1毫秒"
  7. TimeUnit.MILLISECONDS.toMillis(2) || "2毫秒"
  8. TimeUnit.MILLISECONDS.toMillis(3) || "3毫秒"
  9. TimeUnit.MILLISECONDS.toMillis(7) || "7毫秒"
  10. TimeUnit.SECONDS.toMillis(7) || "7秒 "
  11. TimeUnit.HOURS.toMillis(7) || "7小时 "
  12. TimeUnit.DAYS.toMillis(7) + TimeUnit.HOURS.toMillis(2) || "7天 2小时 "
  13. }
  14. def "测试4"() {
  15. expect:
  16. DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  17. Date date1 = format.parse("2010-12-20 12:02:12.321")
  18. Date date2 = format.parse("2010-12-30 10:00:10.301")
  19. // 9天 21小时 57分钟 57秒 980毫秒
  20. println TimeRangeStrUtil.parseDuration(date1, date2)
  21. // 1周 2天 21小时 57分钟 57秒 980毫秒
  22. println TimeStrUtil.parseDurationWeek(date1, date2)
  23. }

工具源码

目前该工具已经作为框架Neo中的一个工具类了,也算推荐下自己的这个框架吧
github:https://github.com/SimonAlong/Neo

  1. import java.util.Date;
  2. import lombok.experimental.UtilityClass;
  3. /**
  4. * 主要用于计算两个时间之间的差值,毫秒,秒,分钟,小时,天,周之间的转换,主要是字符的展示
  5. *
  6. * @author zhouzhenyong
  7. * @since 2019/2/27 下午4:12
  8. */
  9. @UtilityClass
  10. public class TimeRangeStrUtil {
  11. /**
  12. * 我们这里最小的单位是毫秒
  13. */
  14. private static final long MILLIS = 1;
  15. /**
  16. * 秒
  17. */
  18. private static final long SECOND = 1000 * MILLIS;
  19. /**
  20. * 分钟
  21. */
  22. private static final long MINUTE = 60 * SECOND;
  23. /**
  24. * 小时
  25. */
  26. private static final long HOUR = 60 * MINUTE;
  27. /**
  28. * 天
  29. */
  30. private static final long DAY = 24 * HOUR;
  31. /**
  32. * 周
  33. */
  34. private static final long WEEK = 7 * DAY;
  35. /**
  36. * 计算两个时间的差值,用字符表示
  37. * <p>
  38. * @param date1 日期1
  39. * @param date2 日期2
  40. * @return 返回两个值的差值的字符展示:举例:4天 1分钟 12秒 132毫秒
  41. */
  42. public String parseDuration(Date date1, Date date2) {
  43. if (date1.getTime() > date2.getTime()) {
  44. return parseTime(date1.getTime() - date2.getTime());
  45. } else {
  46. return parseTime(date2.getTime() - date1.getTime());
  47. }
  48. }
  49. /**
  50. * 计算两个时间的差值,用字符表示
  51. * <p>
  52. * @param date1 日期1
  53. * @param date2 日期2
  54. * @return 返回两个值的差值的字符展示:举例:1周 1分钟 12秒 132毫秒
  55. */
  56. public String parseDurationWeek(Date date1, Date date2) {
  57. if (date1.getTime() > date2.getTime()) {
  58. return parseWeeks(date1.getTime() - date2.getTime());
  59. } else {
  60. return parseWeeks(date2.getTime() - date1.getTime());
  61. }
  62. }
  63. /**
  64. * 解析时间,根据传入的参数自动返回对应的字符:毫秒,秒,分钟,小时,天:其中这里默认按照天来计算
  65. * <p>
  66. * @param time 时间
  67. * @return 返回时间的字符展示:举例:2天 1分钟 12秒
  68. */
  69. public String parseTime(long time) {
  70. return parseDays(time);
  71. }
  72. /**
  73. * 周:按周来显示
  74. * <p>
  75. * @param time 时间
  76. * @return 返回按周解析后的字符,比如:1周 1分钟 12秒 132毫秒
  77. */
  78. public String parseWeeks(long time) {
  79. StringBuilder sb = new StringBuilder();
  80. if (canWeek(time)) {
  81. sb.append(time / WEEK).append("周 ").append(parseDays(time % WEEK));
  82. } else {
  83. sb.append(parseDays(time % WEEK));
  84. }
  85. return sb.toString();
  86. }
  87. /**
  88. * 按天解析
  89. * <p>
  90. * @param time 时间
  91. * @return 按照解析后的时间字符
  92. */
  93. private String parseDays(long time) {
  94. StringBuilder sb = new StringBuilder();
  95. if (canDay(time)) {
  96. sb.append(time / DAY).append("天 ").append(parseHours(time % DAY));
  97. } else {
  98. sb.append(parseHours(time % DAY));
  99. }
  100. return sb.toString();
  101. }
  102. /**
  103. * 按照小时解析
  104. * <p>
  105. * @param time 时间
  106. * @return 时间类型的字符
  107. */
  108. private String parseHours(long time) {
  109. StringBuilder sb = new StringBuilder();
  110. if (canHour(time)) {
  111. sb.append(time / HOUR).append("小时 ").append(parseMinutes(time % HOUR));
  112. } else {
  113. sb.append(parseMinutes(time % HOUR));
  114. }
  115. return sb.toString();
  116. }
  117. /**
  118. * 按照分钟解析时间
  119. * <p>
  120. * @param time 时间
  121. * @return 按照分钟解析返回的字符
  122. */
  123. private String parseMinutes(long time) {
  124. StringBuilder sb = new StringBuilder();
  125. if (canMinute(time)) {
  126. sb.append(time / MINUTE).append("分钟 ").append(parseSeconds(time % MINUTE));
  127. } else {
  128. sb.append(parseSeconds(time % MINUTE));
  129. }
  130. return sb.toString();
  131. }
  132. /**
  133. * 按照秒解析时间
  134. * <p>
  135. * @param time 时间
  136. * @return 按照秒解析时间返回的字符
  137. */
  138. private String parseSeconds(long time) {
  139. StringBuilder sb = new StringBuilder();
  140. if (canSecond(time)) {
  141. sb.append(time / SECOND).append("秒 ").append(parseMillis(time % SECOND));
  142. } else {
  143. sb.append(parseMillis(time % SECOND));
  144. }
  145. return sb.toString();
  146. }
  147. /**
  148. * 按照毫秒解析时间
  149. * <p>
  150. * @param time 时间
  151. * @return 按照毫秒解析时间返回的字符
  152. */
  153. private String parseMillis(long time) {
  154. StringBuilder sb = new StringBuilder();
  155. if (canMillis(time)) {
  156. sb.append(time).append("毫秒");
  157. }
  158. return sb.toString();
  159. }
  160. private boolean canWeek(long time) {
  161. return time > WEEK;
  162. }
  163. private boolean canDay(long time) {
  164. return time > DAY;
  165. }
  166. private boolean canHour(long time) {
  167. return time > HOUR;
  168. }
  169. private boolean canMinute(long time) {
  170. return time > MINUTE;
  171. }
  172. private boolean canSecond(long time) {
  173. return time > SECOND;
  174. }
  175. private boolean canMillis(long time) {
  176. return time >= 0;
  177. }
  178. }