Snowflake中如何将时间戳转换为毫秒级UNIX/Epoch格式
毫秒级Unix时间戳转换方案
完全可以实现,你之前拿到秒级结果,核心原因是时间解析阶段丢弃了字符串中的毫秒字段,或是计算时没有将毫秒值计入最终结果。毫秒级Epoch时间的计算逻辑非常明确:先计算目标时间到1970-01-01 00:00:00 UTC的总整秒数,乘以1000后加上字符串中携带的毫秒偏移值即可。
常用语言实现示例
- Python
不要直接使用仅返回秒级结果的time.mktime方法,通过datetime模块处理可保留毫秒精度:from datetime import datetime # 若原始时间为UTC时区,需为dt指定tzinfo=timezone.utc dt = datetime.strptime("2022-03-08 17:11:59.901", "%Y-%m-%d %H:%M:%S.%f") ms_ts = int(dt.timestamp() * 1000) # 对应你给出的示例时间,输出结果为1646730719901 - JavaScript/Node.js
原生Date对象的getTime()方法默认返回毫秒级时间戳,注意兼容非ISO格式的时间字符串即可:const timeStr = "2022-03-08 17:11:59.901"; // 替换空格为T适配ISO 8601格式,避免低版本浏览器/Safari解析异常 const date = new Date(timeStr.replace(' ', 'T')); const msTs = date.getTime(); // 输出结果1646730719901 - Java
时间格式化规则中明确匹配毫秒字段即可,注意使用长整型存储结果:import java.text.SimpleDateFormat; import java.util.Date; public class TsConvert { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // 若为UTC时间需调用sdf.setTimeZone(TimeZone.getTimeZone("UTC")) Date date = sdf.parse("2022-03-08 17:11:59.901"); long msTs = date.getTime(); } }
常见踩坑点
- 格式化匹配规则遗漏毫秒段:比如用
%Y-%m-%d %H:%M:%S这类不带毫秒匹配符的规则解析时间串,会直接截断.901部分,最终只能得到秒级结果 - 时区不匹配:原始时间的时区和解析代码默认时区不一致时,最终得到的时间戳会存在小时级的偏移误差
- 数值类型溢出:毫秒级时间戳为13位数字,部分老运行环境用32位整型存储会出现溢出,需改用64位长整型存储结果
内容的提问来源于stack exchange,提问作者kapso
相关产品推荐
相关产品推荐

