Java时间工具类,以后逐步扩展。
以下分别是对时间的操作,获取天、周、月、季度、年度起止时间,对日期的操作三个工具类。
1、对时间的构造和格式转化,比如毫秒值转化为X天X时X分X秒格式,各种时间的构造方法,时间加减方法等。
1 package com.gaspipe.app.common.utils; 2 3 import java.text.SimpleDateFormat; 4 import java.time.*; 5 import java.util.Arrays; 6 import java.util.Date; 7 8 import org.apache.commons.lang3.time.DateFormatUtils; 9 10 /** 11 * 时间计算工具类 12 * @author chenchi 13 * @version 2020-11-03 14 */ 15 public class TimeUtils { 16 17 public static final String PATTERN_yyMMddHHmmss = "yyMMddHHmmss"; 18 public static final String PATTERN_yyMMddHHmmssSSS = "yyMMddHHmmssSSS"; 19 public static final String PATTERN_STANDARD_TIME_MS = "yyyy-MM-dd HH:mm:ss.SSS"; 20 public static final String PATTERN_STANDARD_TIME = "yyyy-MM-dd HH:mm:ss"; 21 //秒置为0 22 public static final String PATTERN_STANDARD_TIME_NO_SECOND = "yyyy-MM-dd HH:mm"; 23 public static final String PATTERN_yyMMdd = "yyMMdd"; 24 public static final String PATTERN_STANDARD_TIME_SIGN = "yyyy-MM-dd#HH:mm:ss"; 25 public static final String PATTERN_STANDARD_TIME_SIGN_NO_BAR = "yyyyMMdd#HHmmss"; 26 public static final String PATTERN_MMdd = "MM-dd"; 27 public static final String PATTERN_yyyyMMdd = "yyyy-MM-dd"; 28 29 30 public static String toTimeString(long time) { 31 TimeUtils t = new TimeUtils(time); 32 int day = t.get(TimeUtils.DAY); 33 int hour = t.get(TimeUtils.HOUR); 34 int minute = t.get(TimeUtils.MINUTE); 35 int second = t.get(TimeUtils.SECOND); 36 StringBuilder sb = new StringBuilder(); 37 if (day > 0){ 38 sb.append(day).append("天"); 39 } 40 if (hour > 0){ 41 sb.append(hour).append("时"); 42 } 43 if (minute > 0){ 44 sb.append(minute).append("分"); 45 } 46 if (second > 0){ 47 sb.append(second).append("秒"); 48 } 49 return sb.toString(); 50 } 51 52 /** 53 * 时间字段常量,表示“秒” 54 */ 55 public final static int SECOND = 0; 56 57 /** 58 * 时间字段常量,表示“分” 59 */ 60 public final static int MINUTE = 1; 61 62 /** 63 * 时间字段常量,表示“时” 64 */ 65 public final static int HOUR = 2; 66 67 /** 68 * 时间字段常量,表示“天” 69 */ 70 public final static int DAY = 3; 71 72 /** 73 * 各常量允许的最大值 74 */ 75 private final int[] maxFields = { 59, 59, 23, Integer.MAX_VALUE - 1 }; 76 77 /** 78 * 各常量允许的最小值 79 */ 80 private final int[] minFields = { 0, 0, 0, Integer.MIN_VALUE }; 81 82 /** 83 * 默认的字符串格式时间分隔符 84 */ 85 private String timeSeparator = ":"; 86 87 /** 88 * 时间数据容器 89 */ 90 private int[] fields = new int[4]; 91 92 /** 93 * 无参构造,将各字段置为 0 94 */ 95 public TimeUtils() { 96 this(0, 0, 0, 0); 97 } 98 99 /** 100 * 使用时、分构造一个时间 101 * @param hour 小时 102 * @param minute 分钟 103 */ 104 public TimeUtils(int hour, int minute) { 105 this(0, hour, minute, 0); 106 } 107 108 /** 109 * 使用时、分、秒构造一个时间 110 * @param hour 小时 111 * @param minute 分钟 112 * @param second 秒 113 */ 114 public TimeUtils(int hour, int minute, int second) { 115 this(0, hour, minute, second); 116 } 117 118 /** 119 * 使用一个字符串构造时间<br/> 120 * Time time = new Time("14:22:23"); 121 * @param time 字符串格式的时间,默认采用“:”作为分隔符 122 */ 123 public TimeUtils(String time) { 124 this(time, null); 125 // System.out.println(time); 126 } 127 128 /** 129 * 使用时间毫秒构建时间 130 * @param time 131 */ 132 public TimeUtils(long time){ 133 this(new Date(time)); 134 } 135 136 /** 137 * 使用日期对象构造时间 138 * @param date 139 */ 140 public TimeUtils(Date date){ 141 this(DateFormatUtils.formatUTC(date, "HH:mm:ss")); 142 } 143 144 /** 145 * 使用天、时、分、秒构造时间,进行全字符的构造 146 * @param day 天 147 * @param hour 时 148 * @param minute 分 149 * @param second 秒 150 */ 151 public TimeUtils(int day, int hour, int minute, int second) { 152 initialize(day, hour, minute, second); 153 } 154 155 /** 156 * 使用一个字符串构造时间,指定分隔符<br/> 157 * Time time = new Time("14-22-23", "-"); 158 * @param time 字符串格式的时间 159 */ 160 public TimeUtils(String time, String timeSeparator) { 161 if(timeSeparator != null) { 162 setTimeSeparator(timeSeparator); 163 } 164 parseTime(time); 165 } 166 167 /** 168 * 设置时间字段的值 169 * @param field 时间字段常量 170 * @param value 时间字段的值 171 */ 172 public void set(int field, int value) { 173 if(value < minFields[field]) { 174 throw new IllegalArgumentException(value + ", time value must be positive."); 175 } 176 fields[field] = value % (maxFields[field] + 1); 177 // 进行进位计算 178 int carry = value / (maxFields[field] + 1); 179 if(carry > 0) { 180 int upFieldValue = get(field + 1); 181 set(field + 1, upFieldValue + carry); 182 } 183 } 184 185 /** 186 * 获得时间字段的值 187 * @param field 时间字段常量 188 * @return 该时间字段的值 189 */ 190 public int get(int field) { 191 if(field < 0 || field > fields.length - 1) { 192 throw new IllegalArgumentException(field + ", field value is error."); 193 } 194 return fields[field]; 195 } 196 197 /** 198 * 将时间进行“加”运算,即加上一个时间 199 * @param time 需要加的时间 200 * @return 运算后的时间 201 */ 202 public TimeUtils addTime(TimeUtils time) { 203 TimeUtils result = new TimeUtils(); 204 int up = 0; // 进位标志 205 for (int i = 0; i < fields.length; i++) { 206 int sum = fields[i] + time.fields[i] + up; 207 up = sum / (maxFields[i] + 1); 208 result.fields[i] = sum % (maxFields[i] + 1); 209 } 210 return result; 211 } 212 213 /** 214 * 将时间进行“减”运算,即减去一个时间 215 * @param time 需要减的时间 216 * @return 运算后的时间 217 */ 218 public TimeUtils subtractTime(TimeUtils time) { 219 TimeUtils result = new TimeUtils(); 220 int down = 0; // 退位标志 221 for (int i = 0, k = fields.length - 1; i < k; i++) { 222 int difference = fields[i] + down; 223 if (difference >= time.fields[i]) { 224 difference -= time.fields[i]; 225 down = 0; 226 } else { 227 difference += maxFields[i] + 1 - time.fields[i]; 228 down = -1; 229 } 230 result.fields[i] = difference; 231 } 232 result.fields[DAY] = fields[DAY] - time.fields[DAY] + down; 233 return result; 234 } 235 236 /** 237 * 获得时间字段的分隔符 238 * @return 239 */ 240 public String getTimeSeparator() { 241 return timeSeparator; 242 } 243 244 /** 245 * 设置时间字段的分隔符(用于字符串格式的时间) 246 * @param timeSeparator 分隔符字符串 247 */ 248 public void setTimeSeparator(String timeSeparator) { 249 this.timeSeparator = timeSeparator; 250 } 251 252 private void initialize(int day, int hour, int minute, int second) { 253 set(DAY, day); 254 set(HOUR, hour); 255 set(MINUTE, minute); 256 set(SECOND, second); 257 } 258 259 private void parseTime(String time) { 260 if(time == null) { 261 initialize(0, 0, 0, 0); 262 return; 263 } 264 String t = time; 265 int field = DAY; 266 set(field--, 0); 267 int p = -1; 268 while((p = t.indexOf(timeSeparator)) > -1) { 269 parseTimeField(time, t.substring(0, p), field--); 270 t = t.substring(p + timeSeparator.length()); 271 } 272 parseTimeField(time, t, field--); 273 } 274 275 private void parseTimeField(String time, String t, int field) { 276 if(field < SECOND || t.length() < 1) { 277 parseTimeException(time); 278 } 279 char[] chs = t.toCharArray(); 280 int n = 0; 281 for(int i = 0; i < chs.length; i++) { 282 if(chs[i] <= ' ') { 283 continue; 284 } 285 if(chs[i] >= '0' && chs[i] <= '9') { 286 n = n * 10 + chs[i] - '0'; 287 continue; 288 } 289 parseTimeException(time); 290 } 291 set(field, n); 292 } 293 294 private void parseTimeException(String time) { 295 throw new IllegalArgumentException(time + ", time format error, HH" 296 + this.timeSeparator + "mm" + this.timeSeparator + "ss"); 297 } 298 299 public String toString() { 300 StringBuilder sb = new StringBuilder(16); 301 sb.append(fields[DAY]).append(',').append(' '); 302 buildString(sb, HOUR).append(timeSeparator); 303 buildString(sb, MINUTE).append(timeSeparator); 304 buildString(sb, SECOND); 305 return sb.toString(); 306 } 307 308 private StringBuilder buildString(StringBuilder sb, int field) { 309 if(fields[field] < 10) { 310 sb.append('0'); 311 } 312 return sb.append(fields[field]); 313 } 314 315 public int hashCode() { 316 final int PRIME = 31; 317 int result = 1; 318 result = PRIME * result + Arrays.hashCode(fields); 319 return result; 320 } 321 322 public boolean equals(Object obj) { 323 if (this == obj) 324 return true; 325 if (obj == null) 326 return false; 327 if (getClass() != obj.getClass()) 328 return false; 329 final TimeUtils other = (TimeUtils) obj; 330 if (!Arrays.equals(fields, other.fields)) { 331 return false; 332 } 333 return true; 334 } 335 336 public static Date dateFormat(String str_date, String pattern) throws Exception{ 337 Date date = new SimpleDateFormat(pattern).parse(str_date); 338 return date; 339 } 340 341 public static String dateString(Date date, String pattern) { 342 SimpleDateFormat sdf=new SimpleDateFormat(pattern); 343 String dateStr = sdf.format(date); 344 return dateStr; 345 } 346 347 public static String dateStringTZ(Date date, String pattern) { 348 String dateStr = dateString(date, pattern); 349 return dateStr.replace("#", "T") + "Z"; 350 } 351 352 353 }