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 }
View Code

相关文章: