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

如何让Django ModelForm的DateTimeField支持毫秒格式时间字符串?

解决Django ModelForm DateTimeField匹配毫秒格式的问题

其实不用纠结%f是微秒格式的限制,Django底层依赖的Python datetime.strptime函数对%f的处理很灵活——它可以匹配1到6位的小数秒。所以直接把input_format设为'%Y-%m-%dT%H:%M:%S.%fZ',就能正确解析像'2018-02-26T14:46:15.704Z'这样的毫秒格式了,解析时会自动把三位毫秒补零成六位微秒处理,完全不影响结果准确性。

具体配置示例

在你的ModelForm里,这样定义DateTime字段即可:

from django import forms
from .models import YourModel

class YourModelForm(forms.ModelForm):
    target_datetime = forms.DateTimeField(
        # 支持毫秒/微秒两种小数秒格式
        input_formats=['%Y-%m-%dT%H:%M:%S.%fZ'],
        # 可选:如果需要前端控件适配格式,可配置widget
        widget=forms.DateTimeInput(
            attrs={'placeholder': '例如:2018-02-26T14:46:15.704Z'},
            format='%Y-%m-%dT%H:%M:%S.%fZ'
        )
    )

    class Meta:
        model = YourModel
        fields = ['target_datetime']

扩展:兼容多种时间格式

如果你的表单需要同时支持不带小数秒、毫秒、微秒的多种格式,只需要给input_formats传入多个格式字符串即可:

input_formats=[
    '%Y-%m-%dT%H:%M:%S.%fZ',  # 匹配毫秒/微秒格式
    '%Y-%m-%dT%H:%M:%SZ',       # 匹配不带小数秒的格式
]

时区注意事项

如果你的项目启用了时区支持(USE_TZ = True),解析后的datetime对象会自动转换为项目配置的时区(默认是UTC)。如果需要强制保留UTC时区,可以确保字段的localize属性设为True,Django会自动处理时区转换逻辑。

内容的提问来源于stack exchange,提问作者Phil Gyford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:18:54