时间戳不带毫秒值解析问题

文章讨论了前端传递给后端的时间戳缺少毫秒值,后端在使用DateTimeFormat和JsonFormat注解解析时出现错误,导致时间被转化为1970年的日期。问题的核心在于时间格式的不匹配和时间戳精度的缺失。

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

前端传递的时间戳不带毫秒值

{"time":1686192136}

后端使用date类型解析,使用了注解

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date time;

接收返回为:time:"1970-01-20T22:20:25.688Z"

处理包含毫秒或更高精度的时间戳复杂,关键在于理解时间戳的表示形式以及所使用的编程语言或工具对高精度时间的支持情况。接下来我会详细解释如何处理这类时间戳,并给出几种常见编程语言的具体示例。 ### **一、理解高精度时间戳** 通常来说,Unix 时间戳默认是以秒为单位记录自1970年1月1日以来经过了多少整秒。然而,在实际应用中,尤其是金融交易系统、实时数据监控等领域,可能会涉及到更精细的时间刻度,如毫秒(千分之一秒)、微秒(百万分之一秒)甚至纳秒(十亿分之一秒)。此时就需要采用相应精度更高的时间戳格式了。 - **毫秒时间戳**:在原有秒级别基础上再添加三位数字作为小数部分,例如 `1720000000.123` 表示从 Unix 纪元开始过了 1,720,000,000 秒又额外过去了 123 毫秒- **微秒级时间戳**:同样地会再多出三个零成为六位小数点后的数,比如 `1720000000.123456`; - **纳秒级时间戳**:则是在微秒的基础上再加上最多九个小数位组成极为精密的时间标记。 ### **二、同编程语言中的处理方法** 由于各编程环境对于亚秒级别的支持程度尽相同,下面分别介绍 Python 和 JavaScript 这两个流行平台上的操作方式: #### **Python 中的操作** Python 的 `datetime` 模块可以很好地应对含有时延信息的情况,而且其内部采用了 C 实现优化性能较好。对于毫秒以上精度的数据可以直接传递给构造函数而需要特别解析。 ```python from datetime import datetime # 假设有一个毫秒级的时间戳 '1720000000.123' ms_timestamp_str = "1720000000.123" # 先去掉小数点前面的部分得到完整的秒数并转化为 int 类型 seconds_part = int(float(ms_timestamp_str)) microsecond_part = round((float(ms_timestamp_str) - seconds_part) * 1e6) date_time_obj = datetime.fromtimestamp(seconds_part).replace(microsecond=microsecond_part) print(f"对应的时间是 {date_time_obj}") ``` 此段脚本首先将传入的字符串分割成两部分——整数秒钟和小数分钟后,然后创建了一个新的 `datetime` 对象同时指定了微妙字段使得最终输出包含了全部细节内容。 如果要生成当前时刻的精确到毫秒乃至更低层级的时间戳,则可以这样做: ```python import time current_ms_ts = str(time.time()).split('.')[0] + '.' + str(round((time.time() % 1)*1_000)).zfill(3) print(current_ms_ts) ``` 这段代码获取到了此刻距 Epoch 后的秒数并将它转换成了含有固定长度的小数部分代表毫秒的新格式。 #### **JavaScript 中的操作** 在浏览器端广泛运用的 JS 支持直接返回毫秒的信息: ```javascript // 获取现在距离纪元之后的完整毫秒计数 const nowMsTimestamp = Date.now(); // 返回的是一个 Long 整形数表示自 UNIX_EPOCH 到现在的毫秒数 console.log(`Now in ms since epoch: ${nowMsTimestamp}`); // 若要获得秒+小数的形式可以用 performance API if ('performance' in window && typeof(performance.now)==='function') { const preciseTimeSinceEpochInMS = Math.floor(performance.now()) + (Date.now()/1000 | 0); console.log(`Precise time since epoch with milliseconds precision: ${preciseTimeSinceEpochInMS.toFixed(3)}`); } ``` 需要注意的是并非所有环境中都兼容 `performance.now()` 函数;另外还有一种更为通用但也稍微粗糙一点的办法就是单纯依赖 `new Date().getTime()` 来取得同样的效果。 而对于接收外部输入的高精度时间戳而言,只需按需提取整数部分类似于 Python 所做的那样即可。 --- 综上所述,无论是哪一种开发环境下都能方便快捷地管理和展示高分辨率的时间间隔信息。只要掌握了基本原理及其对应的语法结构就足以胜任大多数应用场景的需求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值