1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package mobvista.dmp.util;
import org.apache.commons.lang.StringUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateUtil {
public static String format (Date date, String pattern) {
if (date == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
public static String format(String date, String pattern) {
Date now = parse(date, pattern);
return format(now, pattern);
}
public static Date parse (String date, String pattern) {
try {
if (date == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.parse(date);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取指定日期,前n天或后n天
* @param date 指定日期
* @param days 指定天数,负数为前n天,整数位后n天
* @return
*/
public static Date getDay(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + days);
return calendar.getTime();
}
/**
* 获取指定日期,前n天或后n天
* @param date 指定日期
* @param pattern 时间格式表达式
* @param days 指定天数,负数为前n天,整数位后n天
* @return
*/
public static String getDay(Date date, String pattern, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + days);
return format(calendar.getTime(), pattern);
}
/**
* 获取指定日期,前n天或后n天
* @param date 指定日期
* @param pattern 时间格式表达式
* @param days 指定天数,负数为前n天,整数位后n天
* @return
*/
public static Date getDay(String date, String pattern, int days) {
Date now = parse(date, pattern);
return getDay(now, days);
}
/**
* 获取指定日期,前n天或后n天
* @param date 指定日期
* @param pattern 时间格式表达式
* @param days 指定天数,负数为前n天,整数位后n天
* @return
*/
public static String getDayByString(String date, String pattern, int days) {
Date now = parse(date, pattern);
return format(getDay(now, days), pattern);
}
/**
* 获取指定日期前n月或后n月日期
* @param date
* @param pattern
* @param months
* @return
*/
public static String getMonthDay(Date date , String pattern, int months) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + months);
return format(calendar.getTime(), pattern);
}
/**
* 获取指定日期前n月或后n月日期
* @param date
* @param pattern
* @param months
* @return
*/
public static String getMongthDay(String date, String pattern, int months) {
Date now = parse(date, pattern);
return getMonthDay(now, pattern, months);
}
/**
* 替换路径中的日期表达式
* <p>
* 例如:<br/>
* 原字符串:/dw_mkt/auto/ods/event/[yyyy/MM/dd/HH]/table/[yyyy/MM/dd/]<br/>
* 转换后字符串: /dw_mkt/auto/ods/event/2015/12/23/18/table//2015/12/23/
* </p>
* @param path
* @param date
* @param datePattern
* @return
*/
public static String replaceDateFormat(String path, String date, String datePattern) {
if (!StringUtils.isEmpty(path)) {
Date now = DateUtil.parse(date, datePattern);
Pattern pattern = Pattern.compile("\\[[^\\]]*\\]");
Matcher matcher = pattern.matcher(path);
while (matcher.find()) {
String dateStr = matcher.group();
String dateFormat = dateStr.replaceAll("\\[","").replaceAll("\\]", "");
path = path.replace(dateStr, DateUtil.format(now, dateFormat));
}
}
return path;
}
/**
* 获取两个日期之间的所有日期,包含开始和结束时间
* @param startDay
* @param stopDay
* @param pattern
* @param step
* @return
*/
public static List<String> getRangeDay(String startDay, String stopDay, String pattern, int step) {
return getRangeDay(startDay, stopDay, null, pattern, step);
}
/**
* 获取两个日期之间的所有日期,包含开始和结束时间
* @param startDay
* @param stopDay
* @param pattern
* @param step
* @return
*/
public static List<String> getRangeDay(String startDay, String stopDay, String maxDay, String pattern, int step) {
step = step == 0 ? 1 : step;
if (!StringUtils.isEmpty(maxDay)) {
stopDay = stopDay.compareTo(maxDay) < 0 ? stopDay : maxDay;
}
List<String> days = new ArrayList<String>();
while (startDay.compareTo(stopDay) <= 0) {
days.add(startDay);
startDay = getDayByString(startDay, pattern, step);
}
return days;
}
}