涉及到正则表达式,时区转换。
/**
*
* 按格式 yyyy-MM-dd HH:mm:ss 以指定GMT时区进行解析,返回对应的当前系统时区当地时间。
* @param dateString 格式 yyyy-MM-dd HH:mm:ss
* @param timeZoneGMT 格式GMT+8,GMT-7,GMT+09:00,GMT-06:00
* @return
* @throws ParseException
*/
public static Date parseGMTDate(String dateString, String timeZoneGMT) throws ParseException {
String timeZoneGMTRegex = "^GMT[-+](\d{1,2})(:?(\d\d))?$";
if (timeZoneGMT.matches(timeZoneGMTRegex)) {
TimeZone timeZone = TimeZone.getTimeZone(timeZoneGMT);
return parseDate(dateString, "yyyy-MM-dd HH:mm:ss", timeZone,null);
}
throw new ParseException(String.format("input GMT time zone format ['%s'] error ",timeZoneGMT),0);
}
/**
* 按指定格式 <code>pattern</code> 和指定时区进行解析,返回对应的当前系统时区当地时间。
*
* @param date
* @param pattern 格式参考 {@link SimpleDateFormat}
* @param timeZone
* @return
* @throws ParseException
*/
public static Date parseDate(String date, String pattern, TimeZone timeZone,Locale locale) throws ParseException {
Objects.requireNonNull(date, "date");
Objects.requireNonNull(pattern, "pattern");
SimpleDateFormat format = getSimpleDateFormat(pattern, timeZone, locale);
return format.parse(date);
}
private static SimpleDateFormat getSimpleDateFormat(String pattern, TimeZone timeZone, Locale locale) {
if (timeZone == null) {
timeZone = TimeZone.getDefault();
}
// 每次实例化 SimpleDateFormat 需要解析 pattern,非常耗时,但其本身又是线程不安全的,因此借用 ThreadLocal
LRU<String, SimpleDateFormat> formatMap = formats.get();
if (formatMap == null) {
formatMap = new LRU<String, SimpleDateFormat>(128);
formats.set(formatMap);
}
String formatId = pattern + timeZone.getID();
SimpleDateFormat format = formatMap.get(formatId);
if (format == null) {
if(locale != null){
format = new SimpleDateFormat(pattern,locale);
}else{
format = new SimpleDateFormat(pattern);
}
if (!format.getTimeZone().equals(timeZone)) {
format.setTimeZone(timeZone);
}
formatMap.put(formatId, format);
}
return format;
}