后台实体日期类型是string,前端传递时间之类型转换

本文介绍了一种将特定格式的日期字符串转换为Java Date对象的方法,并提供了一个实用的转换函数。此外,还介绍了如何在前端使用Vue+Element UI将日期选择器的值作为毫秒值传递给后端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当实体对应的日期类型是string时,如果不做处理,前端传递到后台的时间将会被转换成类似“ Aug 21 2018 00:00:00 GMT+0800 (中国标准时间)”格式的字符串

这种格式的字符串使用SimpleDateFormat类并不能直接转换,类型不对,当然可以使用字符串截取的方式去转换,这种方式并不是这篇文章介绍的重点

字符串截取后转换的方式:

public final static String FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";

    public final static String[] REPLACE_STRING = new String[]{"GMT+0800", "GMT+08:00"};

    public final static String SPLIT_STRING = "(中国标准时间)";

    public static Date str2Date(String dateString) {
        try {
            dateString = dateString.split(Pattern.quote(SPLIT_STRING))[0].replace(REPLACE_STRING[0], REPLACE_STRING[1]);
            SimpleDateFormat sf1 = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss z", Locale.US);
            Date date = sf1.parse(dateString);
            return date;
        } catch (Exception e) {
            throw new RuntimeException("时间转化格式错误" + "[dateString=" + dateString + "]" + "[FORMAT_STRING=" + FORMAT_STRING + "]");
        }
    }

    public static void main(String[] args) {
        str2Date("Tue Aug 21 2018 00:00:00 GMT+0800 (中国标准时间) 00:00:00");
    }

如果不通过这种方式的话,可以通过选择日期时将时间处理成毫秒值,然后后台在进行转换即可

前端使用vue+element,所以,我是通过element现成的属性转,其他框架可以使用js实现(实现方式自行百度)

 <el-date-picker v-model="value3" type="date" placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="timestamp"> </el-date-picker>

 之后再后台接收时

SimpleDateFormat trante = new SimpleDateFormat("yyyy-MM-dd");
//转换日期格式
Date date = new Date();
date.setTime(“毫秒值”);
String format = trante.format(date);

这种方式还是比较简单的

对于后端接口需要接收 `byte` 类型的数据,前端应该传递一个能够准确映射到该范围内的值。由于 `byte` 的取值范围限定在 `-128 ~ 127` 之间,所以从前端传过来的数值也应控制在这个范围内。 ### 前置考虑因素 1. **数据的有效性**:确保前端发送的数据不会超出 `[-128, 127]` 这一合法区间。 2. **数据类型选择**:尽管最终目标是 `byte`,但在传输过程中可能会经历 JSON 序列化等环节,默认情况下多数框架会将其视为数字而非特化的 `byte` 类型。 --- ### 方案设计建议 #### 使用整数 最简单的方式就是让前端直接发送一个普通整数,并保证它落在规定的范围内。例如 JavaScript 环境下,你可以通过如下验证逻辑确认输入合法性后再提交给服务器: ```javascript function isValidByte(num) { return num >= -128 && num <= 127 && Number.isInteger(num); } // 测试用例 console.log(isValidByte(10)); // true console.log(isValidByte(-130)); // false ``` 然后构造 POST 请求体如 `{value: 42}` 发送至服务端。此时需注意 API 文档标注清楚期望接收到的就是这样一个小范围内的整数。 #### 字符串编码方式 另一种较为复杂但也更为通用的办法是采用字符串编码的形式表征这些字节内容。比如 Base64 编码可以将任意二进制序列转换成 ASCII 字符集中的字符组合,非常适合跨平台、网络边界交换短片段原始比特资料的需求场景。 假设实际业务只关心单独某个字节单元的内容而不涉及复杂的结构化对象时,甚至可以让用户手动指定其十六进制形式的文字描述 ("FF","A5") ,随后由后台解析还原真实含义。 ##### 示例代码片断: 前端准备阶段(伪代码): ```js let hexStr = '7F'; // 十六进制表示的最大正 byte 数 fetch('/api', { method:'POST', body:JSON.stringify({hexValue:hexStr}) }); ``` 而后端处理部分(Java为例)负责解码恢复真正的 byte 实体: ```java String hexFromJson = request.getParameter("hexValue"); if(hexFromJson != null && !hexFromJson.isEmpty()){ int decimalVal = Integer.parseInt(hexFromJson, 16); if(decimalVal>=-128 && decimalVal<=127){ byte targetByte = (byte)decimalVal; System.out.println(targetByte); }else{ throw new RuntimeException("Invalid Hex Value For Byte!"); } } ``` 这种方式的好处在于避免了因浮点误差或隐含扩大而导致的问题风险同时增强了系统的互操作能力。 --- ### 注意事项总结 无论选用何种策略都应当做好充分校验工作防止非法请求污染系统状态同时也考虑到兼容性和易维护性的平衡点上做出合理决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值