您的位置:首页 > 其它

日期工具类,根据日期格式自动选择格式类型

2016-05-05 19:33 681 查看
日期工具类,经常会用到把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

大功告成!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息