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

日期工具类,经常会用到把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

大功告成!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值