将 JSON 纪元时间转换为本地人类可读日期

Posted

技术标签:

【中文标题】将 JSON 纪元时间转换为本地人类可读日期【英文标题】:Converting JSON epoch time to local human readable date 【发布时间】:2019-03-26 17:51:12 【问题描述】:

我正在尝试获取在 Zapier 中提供给我的一些 Stripe 数据,并将其中两个纪元时间转换为人类可读的日期,以便可以轻松读取订阅期。直到几天前,下面的确切代码以前都可以正常工作,现在我收到以下错误:

Traceback (most recent call last):
File "/usr/lib64/python2.7/json/__init__.py", line 251, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/var/runtime/awslambda/bootstrap.py", line 110, in decimal_serializer
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: time.struct_time(tm_year=2018, tm_mon=10, tm_mday=22, tm_hour=14, tm_min=9, tm_sec=58, tm_wday=0, tm_yday=295, tm_isdst=0) is not JSON serializable

这是之前的工作代码:

import ast
import json
import time
data = "amount: 1000
currency: usd
description: None
discountable: True
id: sub_DfoojqxyubarmQ
livemode: True
metadata: 
object: line_item
period: u'start': 1540217398, u'end': 1542895798
plan: u'active': True, u'product': u'prod_fooj56ZAbarmaU', 
u'transform_usage': None, u'name': u'Subscription - Monthly', 
u'aggregate_usage': None, u'created': 1532982748, u'tiers_mode': None, 
u'interval': u'month', u'tiers': None, u'object': u'plan', u'id': 
u'plan_DKMmOfooQEbars', u'currency': u'usd', u'amount': 1000, 
u'interval_count': 1, u'trial_period_days': None, u'livemode': True, 
u'usage_type': u'licensed', u'metadata': u'qb_sub_product': u'8', 
u'nickname': u'Subscription - Monthly', u'statement_descriptor': 
u’SUBSCRIPTION’, u'billing_scheme': u'per_unit'
proration: False
quantity: 1
subscription: None
subscription_item: si_DpfooWbarKUVIh
type: subscription"

#retrieve period data
period_begin = data.find('period:') + 8
period_end = data.find('plan:')

#convert period to JSON
period = ast.literal_eval(data[period_begin:period_end])
json_period = json.dumps(period)
json_period = json.loads(json_period)

#retrieve plan data
plan_begin = data.find('plan:') + 6
plan_end = data.rfind('') + 1

#convert plan to JSON
plan = ast.literal_eval(data[plan_begin:plan_end])
json_plan = json.dumps(plan)
json_plan = json.loads(json_plan)

#period_start and period_end to human readable format
period_start = time.strftime("%-m/%-d/%Y"), time.localtime(json_period['start'])
period_end = time.strftime("%-m/%-d/%Y", time.localtime(json_period['end']))

output = ['json_plan': json_plan, 'json_period': json_period, 'period_start': period_start, 'period_end': period_end]

【问题讨论】:

【参考方案1】:

你有一个错字。括号过早地结束了time.strftime("%-m/%-d/%Y")。您的代码所做的是生成一个 2 值元组:将 now() 格式化为默认的 strftime 格式,并从 epoch 生成 time.localtime

#period_start and period_end to human readable format
period_start = time.strftime("%-m/%-d/%Y", time.localtime(json_period['start']))
period_end = time.strftime("%-m/%-d/%Y", time.localtime(json_period['end']))

【讨论】:

这很尴尬,不知道是如何/何时发生的。谢谢你那双新鲜的眼睛!

以上是关于将 JSON 纪元时间转换为本地人类可读日期的主要内容,如果未能解决你的问题,请参考以下文章

将日期从人类可读格式转换为纪元失败

使用 Moment.js 将人类可读时间转换为 Unix 纪元时间

如何在 python 中将普通时间戳转换为纪元时间戳

以人类可读格式转换纪元时间

将纪元时间戳转换为可读日期不起作用

如何使用 sed 将纪元转换为人类可读的日期时间