如何从Stripe订阅JSON数据中获取月度订阅起止日期及正确转换时间戳
问题根因排查
你转换时间得到1970年的结果,本质是时间戳单位混淆导致的。
Stripe返回的所有Unix时间戳都是秒级精度,而Node.js中Date构造函数默认接收的是毫秒级精度的时间值。直接把秒级时间戳传入构造函数,会被程序误识别为毫秒数计算,最终结果自然落在1970年的时间区间——你之前看到的Mon Jan 19 1970的结果,刚好就是误把1613973928秒当成1613973928毫秒计算得到的(1613973928毫秒约等于18.7天,对应从1970年1月1日起的第19天时刻)。
正确提取Stripe订阅字段
针对你需要存储的订阅开始日期、下一次周期扣费日期,直接从返回的JSON结构中取对应字段即可,不需要手动计算:
- 当前计费周期开始日期:对应
current_period_start字段,你现有样本中的值为1611295528 - 当前计费周期结束日期(即下一次自动扣费/续费时间):对应
current_period_end字段,你现有样本中的值为1613973928 - 订阅首次生效日期:对应
start_date字段,对应当前样本的1个月周期订阅,这个值和current_period_start完全一致
注意:不要直接用created字段作为周期开始时间,虽然样本中两者数值相同,但如果用户经历过试用、中途调整订阅档位,created是订阅记录的创建时间,不一定和当前计费周期的开始时间匹配
正确的秒级时间戳转换方案
转换Stripe返回的时间戳时,只需要把秒级值乘以1000转为毫秒数,再传入Date构造函数即可得到正确时间,常用实现如下:
// Stripe返回的秒级时间戳 const currentPeriodStart = 1611295528 const currentPeriodEnd = 1613973928 // 转换为Date对象(乘1000补毫秒精度) const startDate = new Date(currentPeriodStart * 1000) const endDate = new Date(currentPeriodEnd * 1000) // 转换后验证:对应周期为2021-02-02 至 2021-03-02,符合月度订阅的时间跨度
日常存储推荐选择无时区歧义的格式入库,避免不同时区访问出现时间偏差:
- 可以直接存储原始的秒级时间戳数值,或者转换为毫秒级时间戳
- 也可以转换为ISO标准UTC字符串存储,示例:
const isoStart = startDate.toISOString() // 输出格式:2021-02-02T16:45:28.000Z const isoEnd = endDate.toISOString()
前端面向用户展示时,再根据用户所在的本地时区,把存储的时间值转换为对应本地时区的字符串即可。
内容的提问来源于stack exchange,提问作者Biku7
相关产品推荐
相关产品推荐

