+-
DateUtils 优化支持:yyyy-MM-dd HH:mm:ss, yyyy-MM-dd'T'HH:mm:ss'Z', yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.webex.mats.util.NumberUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DateUtils {
    private static Logger logger = LoggerFactory.getLogger(DateUtils.class);

    private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final String DEFAULT_ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    /**
     *
     * @param dateStr - long ms, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd'T'HH:mm:ss'Z', yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
     * @return
     */
    public static Date string2DateU(String dateStr) {
        Date ret = null;
        if (StringUtils.isBlank(dateStr)) {
            return null;
        }
        if (NumberUtils.isNumber(dateStr)) {
            ret = new Date(NumberUtil.StringToLong(dateStr));
        } else if (!dateStr.contains("T")) {
            ret = string2Date(dateStr);
        } else {
            if (!dateStr.contains(".")) {
                ret = string2Date(dateStr, "yyyy-MM-dd'T'HH:mm:ss'Z'");
            } else {
                int indexDot = dateStr.indexOf(".");
                dateStr = dateStr.substring(0, indexDot + 4) + "Z";
                ret = string2Date(dateStr, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            }

        }
        return ret;
    }

    public static Date string2Date(String dateStr) {
        return string2Date(dateStr, null);
    }

    public static Date string2Date(String dateStr, String pattern) {
        if (StringUtils.isBlank(pattern)) {
            pattern = DEFAULT_FORMAT;
        }
        DateFormat df = new SimpleDateFormat(pattern);
        Date ret = new Date();
        try {
            ret = df.parse(dateStr);
        } catch (ParseException e) {
            logger.error(e.getMessage(), e);
            return ret;
        }

        return ret;
    }

    public static String date2String(Date date) {
        return date2String(date, null);
    }

    public static String date2ISOString(Date date) {
        return date2String(date, DEFAULT_ISO_FORMAT);
    }

    public static String date2String(Date date, String pattern) {
        if (null == date) {
            return null;
        }
        if (StringUtils.isBlank(pattern)) {
            pattern = DEFAULT_FORMAT;
        }
        DateFormat df = new SimpleDateFormat(pattern);
        String ret = df.format(date);

        return ret;
    }

    public static String dayStringOffset(String dayStr, int offset){
        Date day = string2Date(dayStr + " 00:00:00");
        Date result = new Date(day.getTime() + offset*24*60*60*1000);
        return date2String(result, "yyyy-MM-dd");
    }

    public static Date dayString2Date(String dayStr){
        return string2Date(dayStr+ " 00:00:00");
    }

    public static long dayString2ts(String dayStr){
        return string2Date(dayStr+ " 00:00:00").getTime();
    }
}