You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django CMS的datetime格式转换为Vue.js可识别的JS Date

解决Django CMS营业时间JSON导入Vue.js的时间格式问题

看起来你遇到的核心问题是Python的datetime.time对象没法直接被JavaScript解析——你贴的jsonoh其实不是标准JSON格式,而是Python代码里的对象定义,JS肯定认不出datetime.time(19, 0)这种语法。下面分两种场景给你解决方案:

一、最优方案:在Django CMS端输出标准时间格式

这是最靠谱的做法,从源头解决格式问题。你需要在Django把datetime.time对象序列化成JS能识别的字符串(比如"HH:mm"或者ISO时间格式):

Django端处理示例

假设你是从Django模型获取营业时间数据,序列化的时候可以用strftime把时间转成字符串:

# 假设你的模型实例是opening_hours
serialized_data = []
for oh in opening_hours:
    serialized_data.append({
        'name': oh.name,
        'am_start': oh.am_start.strftime("%H:%M"),
        'am_stop': oh.am_stop.strftime("%H:%M"),
        'pm_start': oh.pm_start.strftime("%H:%M"),
        'pm_stop': oh.pm_stop.strftime("%H:%M"),
    })
# 然后把serialized_data转成JSON返回给前端

这样前端拿到的就是标准JSON,比如:

[
  {"pm_start": "19:00", "name": "Monday", "am_start": "11:00", "pm_stop": "23:30", "am_stop": "16:00"},
  // ... 其他日期
]

二、前端应急处理:解析现有Python风格的时间格式

如果没法修改Django端的输出,只能在前端处理"datetime.time(19, 0)"这种字符串,你可以写一个工具函数来提取小时和分钟,再转成JS Date或者时间字符串:

Vue.js中的处理示例

首先,先把你的jsonoh修正为合法的JS数组(把单引号改成双引号,或者用模板字符串包裹),然后写解析函数:

// 工具函数:解析Python datetime.time字符串为JS Date(或者直接返回时间字符串)
function parsePythonTime(timeStr) {
    // 匹配类似"datetime.time(19, 0)"的字符串,提取小时和分钟
    const match = timeStr.match(/datetime\.time\((\d+), (\d+)\)/);
    if (!match) return null;
    
    const [_, hours, minutes] = match;
    // 如果需要Date对象(用于时间比较等操作),可以创建一个基于当前日期的Date
    const date = new Date();
    date.setHours(parseInt(hours), parseInt(minutes), 0, 0);
    return date;
    
    // 如果只是需要显示时间字符串,直接返回`${hours.padStart(2, '0')}:${minutes.padStart(2, '0')}`即可
}

// 在Vue组件中处理数据
export default {
    data() {
        return {
            originalHours: [
                {"pm_start": "datetime.time(19, 0)", "name": "Monday", "am_start": "datetime.time(11, 0)", "pm_stop": "datetime.time(23, 30)", "am_stop": "datetime.time(16, 0)"},
                // ... 其他日期
            ],
            openingHours: []
        };
    },
    mounted() {
        this.openingHours = this.originalHours.map(day => {
            return {
                ...day,
                am_start: parsePythonTime(day.am_start),
                am_stop: parsePythonTime(day.am_stop),
                pm_start: parsePythonTime(day.pm_start),
                pm_stop: parsePythonTime(day.pm_stop)
            };
        });
    }
}

为什么new Date()直接用不行?

因为new Date("datetime.time(19, 0)")会返回Invalid Date——JS的Date构造函数只认特定格式的字符串(比如ISO 8601、"MM/DD/YYYY"等),完全识别不了Python的语法,所以必须先提取出小时和分钟再构建Date对象。

额外提示:如果只是显示营业时间

如果你的需求只是展示营业时间,不需要做时间比较等逻辑,其实不需要转成JS Date,直接提取小时分钟转成"HH:mm"字符串显示更简单,性能也更好。

内容的提问来源于stack exchange,提问作者Nicolas Bocquet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:39:47