赞
踩
在一个完整的微服务架构体系中,字符串和日期的处理往往是最多的。在一些安全应用场景下,还会用到加密算法。为了提升应用的扩展性,我们还应对接口进行版本控制。因此,我们需要对这些场景进行一定的封装,方便开发人员使用。本章中,我们优先从公共模块入手搭建一套完整的微服务架构。
common工程是整个应用的公共模块,因此,它里面应该包含常用类库,比如日期时间的处理、字符串的处理、加密/解密封装、消息队列的封装等。
在一个应用程序中,对日期时间的处理是使用较广泛的操作之一,比如博客发布时间和评论时间等。而时间是以时间戳的形式存储到数据库中的,这就需要我们经过一系列处理才能返回给客户端。
因此,我们可以在common工程下创建日期时间处理工具类Dateutils,其代码如下:
import java.text.ParseException; import java.text.SimpleDateFormat;import java.util.calendar; import java.util.Date; public final class DateUtils { public static boolean isLegalDate(String str, String pattern){ try { SimpleDateFormat format = new SimpleDateFormat(pattern);format.parse(str); return true; } catch (Exception e){ return false; } } public static Date parseString2Date(String str,String pattern){ try { SimpleDateFormat format = new SimpleDateFormat(pattern);return format.parse( str); }catch (ParseException e){ e.printstackTrace();return null; } } public static calendar parseString2calendar(String str,String pattern){ return parseDate2Calendar(parsestring2Date(str, pattern)); } public static String parseLong2DateString(long date,String pattern){ SimpleDateFormat sdf = new SimpleDateFormat(pattern); String sd = sdf.format(new Date(date)); return sd; } public static Calendar parseDate2Calendar(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar; } public static Date parseCalendar2Date(calendar calendar){ return calendar.getTime(); } public static String parseCalendar2String(calendar calendar,String pattern){ return parseDate2String(parsecalendar2Date(calendar), pattern); } public static String parseDate2String(Date date,String pattern) { SimpleDateFormat format = new SimpleDateFormat(pattern); return format.format(date); } public static String formatTime( long time){ long nowTime = System.currentTimeMillis();long interval = nowTime - time; long hours = 3600 * 1000; long days = hours * 24;long fiveDays = days *5;if (interval < hours){ long minute = interval / 1008/ 60; if (minute == 0) { return“刚刚"; } return minute +"分钟前";}else if (interval < days){ return interval / 1000/ 360日 +"小时前";}else if (interval< fiveDays) { return interval / 1000 / 3600/ 24+"天前";}else i Date date = new Date(time); return parseDate2String(date,"MM-dd"); } } }
在处理日期格式时,我们可以调用上述代码提供的方法,如判断日期是否合法的方法isLegalDate。我们在做日期转换时,可以调用以 parse开头的这些方法,通过方法名大致能知道其含义,如parseCalendar2String表示将calendar类型的对象转化为String类型,parseDate2String 表示将Date类型的对象转化为string类型,parseString2Date表示将String类型转化为Date类型。
当然,上述代码无法囊括所有对日期的处理。如果你在开发过程中有新的处理需求时,可以在DateUtils 中新增方法。
另外,我们在做项目开发时应遵循“不重复造轮子”的原则,即尽可能引入成熟的第三方类库。目前,市面上对日期处理较为成熟的框架是 Joda-Time,其引入方法也比较简单,只需要在pom.xml加入其依赖即可,如:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</ artifactId><version>2.10.1</version>
</dependency>
使用Joda-Time 也比较简单,只需构建DateTime对象,通过DateTime对象进行日期时间的操作即可。如取得当前日期后90天的日期,可以编写如下代码:
DateTime dateTime = new DateTime();
System.out.println(dateTime.plusDays(90).toString("yyyy-MM-dd HH:mm:ss"));
Joda-Time是一个高效的日期处理工具,它作为JDK原生日期时间类的替代方案,被越来越多的人使用。在进行日期时间处理时,你可优先考虑它。
在应用程序开发中,字符串可以说是最常见的数据类型,对它的处理也是最普遍的,比如需要判断字符串的非空性、随机字符串的生成等。接下来,我们就来看一下字符串处理工具类stringUtils:
public final class StringUtils{ private static final char[] CHARS ={ '0','1','2','3', '4', '5','6', '7',' 8','9'}; private static int char_length =CHARS.length; public static boolean isEmpty( string str){return null == str ll str.length()== 0; } public static boolean isNotEmpty(string str){ return !isEmpty(str); } public static boolean isBlank(String str){ int strLen; if (null == str ll(strLen = str.length())== 0){ return true; } for (int i= e; i< strLen; i++){ if ( !Character.iswhitespace(str.charAt(i))){ return false; } } return true; } public static boolean isNotBlank(String str){ return !isBlank(str); } public static String randomString(int length){ StringBuilder builder = new StringBuilder(length);Random random = new Random(); for (int i = 0; i< length; i++){ builder.append(random.nextInt(char_length)); } return builder.toString(); } public static string uuid()i return UUID.randomUUID().toString().replace("-",""); } private StringUtils(){ throw new AssertionError(); } }
字符串亦被称作万能类型,任何基本类型(如整型、浮点型、布尔型等)都可以用字符串代替,因此我们有必要进行字符串基本操作的封装。
上述代码封装了字符串的常用操作,如 isEmpty 和 isBlank均用于判断是否为空,区别在于:isEmpty单纯比较字符串长度,长度为0则返回true,否则返回false,如“”(此处表示空格)将返回false;而isBlank判断是否真的有内容,如“”(此处表示空格)返回true。同理,isNotEmpty和isNotBlank均判断是否不为空,区别同上。randomString表示随机生成6个数字的字符串,常用于短信验证码的生成。uuid用于生成唯一标识,常用于数据库主键、文件名的生成。
对于一些敏感数据,比如支付数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。