【问题标题】:What date format to use when dealing with android and django?处理 android 和 django 时使用什么日期格式?
【发布时间】:2016-01-22 20:24:13
【问题描述】:

ISO 8601? 例如 django 很适合这种格式:

ValidationError at /locations/new_tracks/1351320785
["'1351320785' value has an invalid format. It must be in YYYY-MM-DD  HH:MM[:ss[.uuuuuu]][TZ] format."]

还是unixtime? 有一个时区对我来说很重要。 问是因为我没有处理用两种不同框架编写的服务器-客户端系统的经验。

【问题讨论】:

  • 我不明白你为什么将ValidationError 作为证据:“django 擅长这种格式”。 (反之表示代码看不懂格式)
  • 我喂了他 unixtime,他拒绝说它必须是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。"] 是 8601

标签: android python django date-formatting


【解决方案1】:

Django 几乎总是使用底层数据库的适当日期/时间类型的数据库字段在内部以 UTC 时间存储日期。您不能直接访问它 - 在读取/写入数据库时​​,它将转换为 Python“日期时间”对象/从 Python“日期时间”对象转换,详细描述 in the Python docs。使用datetime.datetime.utcfromtimestamptime.mktime(t.timetuple()) 在Unix 时间(特别是根据UTC 指定的POSIX 时间)和Python 日期时间之间的转换非常简单。 Python 日期时间和 ISO 8601 之间的转换可以通过 the iso8601 package 完成。

如果您需要支持本地时区日期/时间,即使它只是一个本地时区,您也应该启用the Django time zones documentation 中详细说明的时区支持。这会增加复杂性,但正如文档所述,“这可以保护您免受夏令时 (DST) 转换的细微且不可重现的错误。”

【讨论】:

  • Unix 时间不是 UTC。它不在任何时区。不过,您可以轻松地将“纪元以来的秒数”转换为 POSIX 上的 UTC 时间 (utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp))。
  • POSIX.1-2008 specifies 纪元时间是以 UTC 表示的,不包括闰秒 - 这就是我在这里所指的 Unix 时间,尽管有些系统可能使用稍微不同的语义。
  • 您了解“始终为 UTC”和“轻松转换 ..”之间的区别吗?您不能将某些有效的 UTC 时间表示为“纪元时间”这一事实明确暗示“是”在这里不合适。见Does Python's time.time() return the local or UTC timestamp?
  • 抱歉,我误解了你的意思——我以为你的意思是 Unix 时间是一个幼稚的时间戳(它的解释取决于上下文而不是标准化)。当然 Unix 时间并不是字面上的 UTC,只是用 UTC 来指定。我稍微编辑了答案以澄清。
  • 如果使用“正确”时区,则 Unix 时间不是以 UTC 形式指定的(在这种情况下它使用 TAI 时标(1970-01-01 00:00:10 TAI 纪元,您可以明确地转换为/从任何 过去 UTC 时间(future (+6m) 时间戳的关系未知)。您可以use utcfromtimestamp(), to get UTC time from the timestamp)。一般而言(C 标准),time() 函数返回实现对当前日历时间的最佳近似值。”(即不限于 UTC、TAI 或任何其他时间尺度、时区)
【解决方案2】:

错误信息明确说明您应该使用什么格式:

必须是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。

如果您只有 Unix 时间,则将其转换为 UTC 时间(由 datetime 对象表示)并使用 RFC 3339 time format (a profile of ISO 8601) 对其进行序列化:

>>> from datetime import datetime
>>> datetime.utcfromtimestamp(1351320785).isoformat() + 'Z'
'2012-10-27T06:53:05Z'

如果您的 android 客户端不理解 rfc 3339,请尝试变体:

>>> datetime.utcfromtimestamp(1351320785).isoformat(' ') + '+00:00'
'2012-10-27 06:53:05+00:00'
>>> datetime.utcfromtimestamp(1351320785).isoformat(' ') + '+0000'
'2012-10-27 06:53:05+0000'

.strftime() method provides even more flexibility.

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2018-04-25
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多