Java Date转long 秒单位 返回给前台

这篇博客介绍了如何在Java中将Date类型转换为long秒单位,通过自定义JsonSerializer子类`Date2LongSerializer`,并在实体类中使用注解实现转换。这种方法可以确保在序列化时日期以long值的秒数形式正确返回给前台。

通过自定义的一个子类 继承 JsonSerializer类
然后重写里面的方法 public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException

之后我们在需要将Date转换成long的实体类中 添加注解 @JsonSerialize(using = Date2LongSerializer.class) 即可。

代码如下:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
 * @author kenshin
 * @date 2018/7/27 上午8:42
 */
public class Date2LongSerializer extends JsonSerializer<Date> {

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

/**
 * DTO的意思就是  data transform object 数据传输对象
 * 对应OrderMaster 只是里面多了一些 list
 * @author kenshin
 * @date 2018/7/19 下午10:29
 */
@Data
public class OrderDTO {

    //、、、省略其他属性

    //创建时间
    @JsonSerialize(using = Date2LongSerializer.class)//这里 using的类是我们自己创建的 用于将这里的时间转换成 long 秒精度
    private Date createTime;

    //更新时间
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;

}

我们可以测试在不加字段前返回的数值 和添加之后返回的数值,是不同的

Java 中,可以通过 `java.util.Random` 类或更安全的 `java.security.SecureRandom` 类结合时间戳来生成随机数。使用时间戳作为种子可以确保每次运行程序时生成的随机数序列不同。 一种常见的方法是将系统当前的时间戳(通过 `System.currentTimeMillis()` 获取)作为随机数生成器的种子。这种方式能够提供一定程度的不可预测性,尤其适用于非加密场景下的随机数生成 [^2]。 ### 示例代码:使用时间戳作为种子生成随机数 ```java import java.util.Random; public class TimestampRandomGenerator { public static void main(String[] args) { // 使用当前时间戳作为随机数生成器的种子 long seed = System.currentTimeMillis(); Random random = new Random(seed); // 生成一个介于0到100之间的随机整数 int randomNumber = random.nextInt(101); // 0 到 100 包括 System.out.println("生成的随机数: " + randomNumber); } } ``` 若需更高的安全性,例如用于密码学用途,则应使用 `SecureRandom`: ```java import java.security.SecureRandom; public class SecureTimestampRandomGenerator { public static void main(String[] args) { // 使用当前时间戳作为随机数生成器的种子 long seed = System.currentTimeMillis(); SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(seed); // 设置种子 // 生成一个介于0到100之间的安全随机整数 int secureRandomNumber = secureRandom.nextInt(101); // 0 到 100 包括 System.out.println("生成的安全随机数: " + secureRandomNumber); } } ``` ### 前台与后台服务的约定 在前后端交互中,如果希望基于时间戳生成随机数并进行约定,通常需要以下几点: 1. **时间同步机制**:前后端应保持时间同步,建议使用 NTP(网络时间协议)来校准时间,以避免因时间差异导致的不一致问题。 2. **种子计算规则**:前后端可协商一个固定的偏移量或者采用特定算法(如哈希处理)对时间戳进行处理,从而生成相同的种子值。 3. **随机数生成逻辑一致性**:前后端使用的随机数生成算法必须一致,否则即使种子相同,结果也会不同。 4. **安全性考虑**:对于敏感操作,应使用加密安全的随机数生成方式,并结合其他因素(如用户会话 ID、盐值等)增强随机性 。 ### 示例:前后端共同遵循的随机数生成逻辑 假设前端和后端都使用如下逻辑: - 每分钟为一个周期,取当前分钟数作为基础种子。 - 加上固定偏移量(如 123456)。 - 使用该种子生成一个范围在 0~999 的随机数。 #### 后端实现(Java) ```java import java.util.Calendar; import java.util.Random; public class SharedRandomGenerator { public static int generateSharedRandom() { Calendar calendar = Calendar.getInstance(); int minute = calendar.get(Calendar.MINUTE); long seed = minute * 1000L + 123456L; // 固定偏移量 Random random = new Random(seed); return random.nextInt(1000); // 0 ~ 999 } public static void main(String[] args) { System.out.println("共享随机数: " + generateSharedRandom()); } } ``` #### 前端实现(JavaScript) ```javascript function generateSharedRandom() { const now = new Date(); const minute = now.getMinutes(); const seed = minute * 1000 + 123456; // 与后端一致 Math.seedrandom(seed); // 使用 seedrandom 插件 return Math.floor(Math.random() * 1000); // 0 ~ 999 } console.log("共享随机数: " + generateSharedRandom()); ``` > 注意:JavaScript 原生不支持设置随机数种子,因此需引入第三方库如 [`seedrandom`](https://github.com/davidbau/seedrandom) 来实现类似功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值