【问题标题】:Datetime string doesn't match after strftime() and strptime()日期时间字符串在 strftime() 和 strptime() 之后不匹配
【发布时间】:2014-01-02 17:26:21
【问题描述】:

在一个 Django 项目中,我在数据库中存储了一个日期时间字段。 我从网页获取日期字符串,并使用 datetime.strptime() 转换为 datetime 类型,并将其分配给 DatetimeField。但是当我获取字段并使用strftime获取字符串时,已经休息了一天,为什么会出现这种情况?

datestr = "2013-12-12";
expireDate = datetime.strptime(datestr, "%Y-%m-%d");
datamodel.time = expireDate;
datamodel.save();

# when I get the model in another method
expireDate = datamodel.time;
datestr = expireDate.strftime("%Y-%m-%d"); # I get "2013-12-11"

我认为这可能与时区有关,但不知道如何解决。请帮忙!

【问题讨论】:

  • expireDate = datamodel.timeprint expireDate 的值是多少?
  • 您的设置文件中的时区是什么?
  • 您是否使用时区支持?
  • 启用时区时通常建议安装pytz。试试看?
  • 我正在使用 django 时区支持。当我从模型中打印 expireDate 时,我得到:datetime.datetime(2013, 12, 11, 16, 0, tzinfo=)。我在 settings.py 中的时区设置是 TIME_ZONE = 'Asia/Shanghai'。

标签: python django datetime timezone


【解决方案1】:

您正在存储日期时间对象,而不仅仅是日期。这意味着时间设置为您当地时区的午夜。再次检索 datetime 对象是在 UTC 时区进行,这对您来说是 6 小时的休息时间。

用时区存储日期时间对象

from django.utils.timezone import utc

datestr = "2013-12-12"
expireDate = datetime.strptime(datestr, "%Y-%m-%d")
datamodel.time = expireDate.replace(tzinfo=utc)
datamodel.save()

如果您正在处理只是个日期,您也可以切换到使用DateField 而不是DateTimeField

datestr = "2013-12-12"
expireDate = datetime.strptime(datestr, "%Y-%m-%d").date()

date 对象没有与之关联的时区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2023-02-24
    • 2014-11-04
    相关资源
    最近更新 更多