public class DateUtil {
private static final Object lockObj = new Object();
private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<>();
private static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
if (tl == null) {
synchronized (lockObj) {
tl = sdfMap.get(pattern);
if (tl == null) {
System.out.println("put new sdf of pattern " + pattern + " to map");
tl = ThreadLocal.withInitial(() -> {
System.out.println("thread: " + Thread.currentThread() + " init pattern: " + pattern);
return new SimpleDateFormat(pattern);
});
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
public String format(Date date, String pattern) {
return getSdf(pattern).format(date);
}
public Date parse(String dateStr, String pattern) throws ParseException {
return getSdf(pattern).parse(dateStr);
}
public static Integer getCountdownDays(Date dateSql,Integer type){
String stringTimeNow = getStringTime(new Date()).substring(0, 4);
String stringTimeSql = getStringTime(dateSql).substring(4);
stringTimeSql=stringTimeNow+stringTimeSql;
Long timeSqlDate = getTimestamp(stringTimeSql);
Long timeNowDate = getTimestamp(getStringTime(new Date()));
int timeDistance;
if (type==1){
timeDistance= getTimeDistance(new Date(timeSqlDate),new Date(timeNowDate));
}else {
timeDistance= getTimeDistance(new Date(timeNowDate), new Date(timeSqlDate));
}
if (timeDistance == 0 ){
return 0;
}else if (timeDistance>0){
return timeDistance;
}else {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(timeSqlDate));
calendar.add(Calendar.YEAR, 1);
timeSqlDate= calendar.getTime().getTime();
return getTimeDistance(new Date(timeNowDate), new Date(timeSqlDate));
}
}
public static int getTimeDistance(Date beginDate , Date endDate ) {
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
long beginTime = beginCalendar.getTime().getTime();
long endTime = endCalendar.getTime().getTime();
int betweenDays = (int)((endTime - beginTime) / (1000 * 60 * 60 *24));
endCalendar.add(Calendar.DAY_OF_MONTH, -betweenDays);
endCalendar.add(Calendar.DAY_OF_MONTH, -1);
if(beginCalendar.get(Calendar.DAY_OF_MONTH)==endCalendar.get(Calendar.DAY_OF_MONTH))
return betweenDays + 1;
else
return betweenDays;
}
public static Long getTimestamp(String time) {
Long timestamp = null;
try {
timestamp = new SimpleDateFormat("yyyy-MM-dd").parse(time).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return timestamp;
}
public static String getStringTime(Date timestamp) {
return new SimpleDateFormat("yyyy-MM-dd").format(timestamp.getTime());
}
public static String getStringTimeMore(Date timestamp) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp.getTime());
}
public List<String> getDateList(int days){
List<String> list = new ArrayList<>();
int days_temp = Math.abs(days);
Calendar calendar = Calendar.getInstance();
if(days > 0){
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + days_temp);
for(int i = 1; i < days_temp; i++){
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1);
String str_date = this.format(calendar.getTime(),"yyyy-MM-dd");
list.add(str_date);
}
}else {
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days_temp);
for(int i = 1; i < days_temp; i++){
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
String str_date = this.format(calendar.getTime(),"yyyy-MM-dd");
list.add(str_date);
}
}
return list;
}
public static Long getStartTime() {
Calendar todayStart = Calendar.getInstance();
todayStart.set(Calendar.HOUR_OF_DAY, 0);
todayStart.set(Calendar.MINUTE, 0);
todayStart.set(Calendar.SECOND, 0);
todayStart.set(Calendar.MILLISECOND, 0);
return todayStart.getTime().getTime();
}
public static Long getEndTime() {
Calendar todayEnd = Calendar.getInstance();
todayEnd.set(Calendar.HOUR_OF_DAY, 23);
todayEnd.set(Calendar.MINUTE, 59);
todayEnd.set(Calendar.SECOND, 59);
todayEnd.set(Calendar.MILLISECOND, 999);
return todayEnd.getTime().getTime();
}
public static String dealDateFormat(String oldDate) {
Date date1 = null;
DateFormat df2 = null;
try {
oldDate= oldDate.replace("Z", " UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
Date date = df.parse(oldDate);
SimpleDateFormat df1 = new SimpleDateFormat ("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK);
date1 = df1.parse(date.toString());
df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} catch (ParseException e) {
e.printStackTrace();
}
return df2.format(date1);
}
public static long getWeekStartTime() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale. getDefault());
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0,
0, 0);
int day_of_week = cal.get(Calendar. DAY_OF_WEEK) - 1;
if (day_of_week == 0 ) {
day_of_week = 7 ;
}
cal.add(Calendar.DATE , -day_of_week + 1 );
return cal.getTime().getTime();
}
public static long getWeekEndTime() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale. getDefault());
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 23,
59, 59);
int day_of_week = cal.get(Calendar. DAY_OF_WEEK) - 1;
if (day_of_week == 0 ) {
day_of_week = 7 ;
}
cal.add(Calendar.DATE , -day_of_week + 7 );
return cal.getTime().getTime() ;
}
public static Long getMonthStartTime(Long timeStamp) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
public static Long getMonthEndTime(Long timeStamp) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTimeInMillis();
}
}