Django和Python之间的微秒差异

2024-04-19 13:49:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用datetime属性作为动态窗体控件命名约定的一部分。我注意到DateTime属性中的Python微秒长度总是6个字符,即使第一个字符是0。但是,在我的Django表单中,Django微秒会减少前导的0。在

这是我的Django:

name="foo-{{datecreated|date:'Y-m-d H:i:s.u}}"

从而产生:

^{pr2}$

这是我的Python(在appengine的数据模型中):

^{3}$

结果是:

datecreated: 2013-11-15 15:41:33.040350

我没有看到Django或Python文档中提到过这一点。有什么想法吗?在

更新: 基于以下非常有帮助的建议,我已经确认了问题是,当前支持的Django-in-App-Engine版本有一个bug。关于支持django1.6之前的解决方案,这是我正在考虑的。基本上检查Django中微秒字符串的长度,必要时连接前导0。我缺少什么缺点吗?在

{%if datecreated|date:'u'|length == 6 %}render control name as above 
{% else %} 
<input type="radio" name="foo-{{datecreated|date:'Y-m-d H:i:s'}}{{datecreated|date:'.0u'}}"

Tags: djangonamedatetimedate属性foo动态窗体
2条回答

Django doc提到过。在

date

Formats a date according to the given format.

Uses a similar format as PHP’s date() function (http://php.net/date) with some differences.

这些格式字符不会在模板之外的Django中使用。它们被设计为与PHP兼容,以便于设计师进行转换。

除此之外,我认为您可能会将日期/日期时间对象与其字符串表示混淆。在

你说的是什么。在模板之外,在视图和模型中,日期/日期时间对象与非django项目中的对象相同。在

你说的Here is my Python,实际上是Google Appengine ndb DateTimeProperty。在

Python的官方datetime字符串表示格式(strftime)不包括微秒,我认为这是django选择使用PHP的原因之一

看看您的代码,以及指向php引用的链接,我认为发生了以下情况:

  • Django注意到“这些格式字符不在模板之外的Django中使用。它们被设计为与PHP兼容,以便于设计师进行转换”(正如@Leonardo.Z所提到的那样)

  • 查看Django文档中的日期模板格式[https://docs.djangproject.com/en/dev/ref/templates/builtins/#日期],大多数项目特别提到是否有前导零

  • 微秒只是状态000000 to 999999

  • 查看php文档[http://bd1.php.net/manual/en/function.date.php],大多数事物都显式地用/不带前导零来表示

  • php状态:Microseconds (added in PHP 5.2.2). Note that date() will always generate 000000 since it takes an integer parameter, whereas DateTime::format() does support microseconds. Example: 654321

所以在我看来,这基本上是有人没有对模板字符串进行零填充,尽管他们应该这样做,因为函数所遵循的原始文档是不好的。在

让我们看看microseconds的源代码:

Django日期解析看起来是正确的:https://github.com/django/django/blob/master/django/utils/dateparse.py

我想这是写日期的标签:https://github.com/django/django/blob/c347f78cc1b2a06958f692f0622deceac534dc6b/django/utils/dateformat.py#L173-L175

看,里面的日期是零填充的。在

让我们看看档案的历史。。。在

此提交中引入了零填充:https://github.com/django/django/commit/822cfce3df53301d9f9f4c14bd8a0cb2a1956e2e

这个提交已经超过一年了,是1.6c1的一部分,发布候选版本,它早于当前实际的django产品发布。在

tldr;django的旧版本有一个已知的bug。更新django。

相关问题 更多 >