繁体   English   中英

Django和Python之间的微秒差异

[英]Microsecond discrepancy between Django and Python

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

这是我的Django:

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

这创造了:

name="foo-2013-11-15 15:41:33.40350"

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

datecreated = db.DateTimeProperty(auto_now_add = True)

结果如下:

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

我没有在Django或Python文档中看到这一点。 有任何想法吗?

更新:基于下面非常有用的建议我已经确认问题实际上是App Engine中当前支持的Django版本有一个错误。 关于直到支持Django 1.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'}}"

看看你的代码,以及php参考的链接,我认为这种情况正在发生:

  • Django指出“这些格式字符不在模板之外的Django中使用。它们被设计为与PHP兼容,以便于设计师的过渡”(如@ Leonardo.Z所提到的)]

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

  • 微秒仅表示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 (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

并且看,它是在那里填充日期的零填充。

那么让我们来看看文件的历史......

zeropadding在此提交中引入: https//github.com/django/django/commit/822cfce3df53301d9f9f4c14bd8a0cb2a1956e2e

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

tldr; 你有一个已知错误的旧版django。 更新django。

Django doc提到了它。

日期

根据给定格式格式化日期。

使用与PHP的date()函数( http://php.net/date )类似的格式,但有一些差异。

这些格式字符不在模板之外的Django中使用。 它们旨在与PHP兼容,以方便设计人员的过渡。

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

你说的是Here is my Django:实际上是in Django templates 在模板之外,在视图和模型中,date / datetime对象与非django项目中的对象相同。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM