考虑到对日期转换及转换结果的可扩展性,符合设计模式的开闭原则,因此笔者用策略模式重新改进了一个取日期的工具类,方便后期取用。
package top.powersys.core.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class DateUtils {
//设置转换格式
private volatile static SimpleDateFormat sdf_all = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private volatile static SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
private volatile static SimpleDateFormat sdf_ym = new SimpleDateFormat("yyyy-MM");
//设置转换参,0为年月日时分秒,1为年月日,2为年月
public static final int SDF_ALL = 0;
public static final int SDF_YMD = 1;
public static final int SDF_YM = 2;
/**
* 时间转为UTC时间
* @param date
* @return
*/
public static synchronized Date getDateToUTC(Date date){
Calendar calender = Calendar.getInstance();
calender.setTimeInMillis(date.getTime());
int zoneOffset = calender.get(Calendar.ZONE_OFFSET);
int dst = calender.get(Calendar.DST_OFFSET);
calender.add(Calendar.MILLISECOND,-(zoneOffset+dst));
return new Date(calender.getTimeInMillis());
}
/**
* 将utc时间转为对应时区时间
* @param date
* @param zone
* @return
*/
public static synchronized Date getUTCtoDate(Date date, String zone){
TimeZone timeZone = TimeZone.getTimeZone(zone);
long targetTime = date.getTime() + timeZone.getRawOffset();
return new Date(targetTime);
}
public static String getDateToString(Date date,int type){
switch (type){
case SDF_YMD: return sdf_ymd.format(date);
case SDF_YM: return sdf_ym.format(date);
default: return sdf_all.format(date);
}
}
public static Date getStringToDate(String date,int type){
try {
switch (type){
case SDF_YMD: return sdf_ymd.parse(date);
case SDF_YM: return sdf_ym.parse(date);
default: return sdf_all.parse(date);
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Date dateToUTC = getDateToUTC(new Date());
System.out.println(dateToUTC);
System.out.println(getUTCtoDate(dateToUTC, "GMT+2"));
Date d = getUTCtoDate(dateToUTC,"GMT+2");
String date = getDateToString(d, DateUtils.SDF_ALL);
System.out.println(date);
System.out.println(getStringToDate(date, DateUtils.SDF_YMD));
}
}