日期工具类,经常会用到把String转成Date或long类型的方法,一般需要指定格式类型(pattern,比如"yyyy-MM-dd HH:mm:ss"),转换方法如下:
/** * 将指定的日期转换成Unix时间戳 * * @param String date 需要转换的日期 * @param String dateFormat 需要转换的日期格式 * @return long 时间戳,单位:秒 */ public static long dateToUnixTimestamp(String dateStr, String pattern) { long timestamp = 0; try { timestamp = new SimpleDateFormat(pattern).parse(dateStr).getTime(); } catch (ParseException e) { e.printStackTrace(); } return timestamp/1000; }
这种方法有个缺点就是需要指定一个pattern,如果格式变化了,就得改代码。
利用正则表达式,可以解决这个问题。代码如下:
先定义一个枚举类,把各种已知的格式及其正则表达式关联起来。同时定义一个方法,利用这个枚举类,通过日期字符串获取格式类型:
/** 日期格式枚举类,根据需要添加其他格式 **/ public enum DatePattern{ ISO_SECOND("yyyy-MM-dd'T'HH:mm:ss", "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"), ISO_MINUTE("yyyy-MM-dd'T'HH:mm", "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"), DATE_TIME("yyyy-MM-dd HH:mm:ss", "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"), DATE_ONLY("yyyy-MM-dd", "^\\d{4}-\\d{2}-\\d{2}$"), YEAR_MONTH("yyyy-MM", "^\\d{4}-\\d{2}$"); DatePattern(String pattern, String regex){ this.pattern = pattern; this.regex = regex; } public String getPattern() { return pattern; } public String getRegex() { return regex; } private String pattern; private String regex; /** * 根据日期字符串,判断该日期的格式类型。 * * @param dateStr 日期字符串 * @return 日期的格式类型,比如getPatternByDateStr("2016-04-27 10:15:08")返回:"yyyy-MM-dd HH:mm:ss" */ public static String getPatternByDateStr(String dateStr){ for(DatePattern df : DatePattern.values()){ if(RegexUtils.matches(dateStr, df.getRegex())){ return df.getPattern(); } } return null; } }
/** * 将指定的日期转换成Unix时间戳 * * @param String date 需要转换的日期,自动匹配日期格式 * @return long 时间戳,单位:秒 */ public static long dateToUnixTimestamp(String dateStr) { String d = dateStr.trim(); String pattern = DatePattern.getPatternByDateStr(dateStr); return dateToUnixTimestamp(d, pattern); } //测试 public static void main(String[] args) { System.out.println(dateToUnixTimestamp("2016-05-05T15:22:09")); System.out.println(dateToUnixTimestamp("2016-05-05 15:22:09")); System.out.println(dateToUnixTimestamp("2016-05-05")); }
1462432929
1462432929
1462377600
大功告成!