日期工具类,经常会用到把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;
}
}
利用这个枚举类的字符串转long方法(字符串转Date的方法类似,略):
/**
* 将指定的日期转换成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
大功告成!