String类型的日期与BigDecimal类型相互转化

实际开发中的案例,需要将日期格式为String类型的"2018-11-13",然后转为BigDecimal(8,2)类型的20181113存入数据库。查询时再将数据转为String类型格式展示。

1、先定义工具类:

(如果没有传入生失效时间,这自动设置一个默认值;如果有则,不需要。)

/**
 * @Description 工具类
 * Create at: 2018年11月21日 下午4:41:54
 */
public class CommonUtils {

	private final static String HYPHEN = "-";

	
	/**
	 * 默认失效时间9999-12-31
	 */
	public static BigDecimal getDefaultInvalidTime() {
		// 获取String类型的时间
		String defaultInvalidTime = "9999-12-31";
		return strToBigDecimal(defaultInvalidTime);
	}

	/**
	 * 默认生效时间 为当前时间
	 */
	public static BigDecimal getNowDate() {
		// 我要获取当前的日期
		Date date = new Date();
		// 设置要获取到什么样的时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		// 获取String类型的时间
		String createdate = sdf.format(date);
		return strToBigDecimal(createdate);
	}

	/**
	 * 生效日期,失效日期 String->BigDecimal
	 * 
	 * @param effectiveDate
	 * @return BigDecimal
	 */
	public static BigDecimal strToBigDecimal(String effectiveDate) {
		StringBuilder sb = new StringBuilder();
		String[] splitWithHyphen = effectiveDate.split(HYPHEN);
		for (String item : splitWithHyphen) {
			sb.append(item);
		}
		String newEffectiveDate = sb.toString();
		BigDecimal bd = new BigDecimal(newEffectiveDate);
		return bd;
	}

	/**
	 * 生效日期,失效日期 BigDecimal->String
	 * 
	 * @param effectiveDate
	 * @return String
	 */
	public static String bigDecimalToStr(BigDecimal effectiveDate) {
		String strEffectiveDate = effectiveDate.toString();
		StringBuilder sb = new StringBuilder();
		sb.append(strEffectiveDate);
		sb.insert(4, HYPHEN);
		sb.insert(7, HYPHEN);
		return sb.toString();
	}
}

2、调用(伪代码)

/**
*String->BigDecimal 
* 入库
*/
public void demo(Param param){
    //传入的参数param

// 设置默认生失效时间
		BigDecimal effectiveStartDate = null;
		BigDecimal effectiveEndDate = null;
		try {
			effectiveStartDate = StringUtils.isBlank(param.getEffectiveStartDate()) ? CommonUtils.getNowDate()
					: CommonUtils.strToBigDecimal(param.getEffectiveStartDate());
			effectiveEndDate = StringUtils.isBlank(param.getEffectiveEndDate()) ? CommonUtils.getDefaultInvalidTime()
					: CommonUtils.strToBigDecimal(param.getEffectiveEndDate());
		} catch (Exception e) {
			throw new ApplicationServiceException("生失效时间转换异常");
		}
}

/**
*BigDecimal ->String
* 查询展示
*/
public void demo01(Vo vo){
    // 日期转换BigDecimal->String
				vo.setEffectiveStartDateName(CommonUtils.bigDecimalToStr(vo.getEffectiveStartDate()));
				vo.setEffectiveEndDateName(CommonUtils.bigDecimalToStr(vo.getEffectiveEndDate()));
}

3、效果

效果图

 

一般都要判断失效时间-生效时间>=0 .视具体的业务来定。

### EntityVO换中的数据类型不匹配及换错误 当处理Entity到Value Object (VO)之间的换时,可能会遇到多种数据类型不匹配或换失败的情况。这些情况通常发生在字段映射过程中,由于源对象(Entity)和目标对象(VO)结构不同而导致。 #### 常见案例 1. **日期时间格式差异** 如果实体类中某个属性为`java.util.Date`类型,在换至VO时尝试将其赋值给字符串类型的变量,则会抛出异常。这种情况下应确保双方采用相同的时间表示方式并进行必要的格式化操作[^1]。 2. **枚举类型处理不当** 实体可能包含枚举型成员变量,而对应的视图模型期望接收的是整数或者字符串形式的标识符。此时如果直接复制原始值就会引发类型冲突问题。应当编写辅助函数完成从枚举实例向基本数据类型变过程。 3. **数值精度丢失** 对于浮点数或其他高精度算术运算结果,在由数据库读取后存入Java Bean再传送给前端展示层的过程中容易发生舍入误差现象。为了避免此类状况的发生,建议使用BigDecimal代替double/float作为金额等敏感信息载体,并设置合理的舍入模式。 4. **布尔逻辑表达混乱** 后端代码里经常用true/false来代表开关状态;然而某些API文档规定了0/1这样的编码规则用于描述同样的概念。因此在相互转化期间必须注意保持一致性的原则,防止因理解偏差造成业务流程紊乱。 ```java // 错误示范:未考虑null值以及不同的默认行为 vo.setStatus(entity.getStatus() ? "ON" : "OFF"); // 正确做法:引入三元运算符安全判断机制 String status = entity.getStatus() != null && entity.getStatus() ? "ON" : "OFF"; vo.setStatus(status); ``` 5. **集合元素遍历失误** 当涉及到复杂的数据结构比如列表、数组的时候,很容易因为索引越界等原因触发ArrayIndexOutOfBoundsException之类的运行期错误。所以在执行批量加工之前要先验证容器是否为空并且合理规划迭代策略。 --- 针对上述提到的各种情形,可以采取如下措施加以防范: - 使用成熟的ORM框架自带的功能简化持久层到表现层间的传输工作; - 编写单元测试覆盖所有已知边界条件下的输入组合; - 利用AOP切面编程技术拦截非法访问企图从而提前预警潜在风险; - 遵循面向接口设计的思想构建灵活可扩展的应用程序架构体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值