可能重复:
pytz的奇怪时区问题
这似乎是错的:
>>> import pytz
>>> z1 = timezone('America/Edmonton')
>>> z2 = timezone('US/Mountain')
>>> z1
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>
>>> z2
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>
>>> pytz.VERSION
'2012f'
>>>
Run Code Online (Sandbox Code Playgroud)
'America/Edmonton'和'US/Eastern'应该是同一时区(STD的17:00:00).更不用说16:26:00没有任何意义.
- 更新 -
以上是Jon Skeet的回答.但是,当我这样做时,事情变得奇怪:
>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)
Run Code Online (Sandbox Code Playgroud)
我创造了一个天真的约会.由于'America/Edmonton' 是我的时区,我尝试手动设置:
>>> d2 = d.replace(tzinfo=timezone('America/Edmonton'))
>>> d2
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)
Run Code Online (Sandbox Code Playgroud)
这不应该有任何改变,因为这是正确的TZ.然而:
>>> d2.astimezone(timezone('US/Eastern'))
datetime.datetime(2012, 10, …Run Code Online (Sandbox Code Playgroud) 我有一个 Django 测试,我需要模拟 datetime.now(),因为它测试的视图使用 datetime.now()
\n\n我正在使用 Michael Foord 的模拟库,版本 1.0.1。
\n我正在寻找一种不使用其他库(例如 freezegun)的解决方案。
大多数例子都是这样的,这个导入 datetime 并覆盖它,但我正在导入 datetime.datetime 并尝试覆盖它,由于某种原因,这不起作用。
\n\n覆盖日期时间的工作原理:
\n\nimport mock\nimport datetime\n\nclass FixedDate(datetime.datetime):\n\n @classmethod\n def now(cls):\n return cls(2010, 1, 1)\n\n@mock.patch(\'datetime.datetime\', FixedDate)\ndef myTest():\n print(datetime.datetime.now())\n\nmyTest()\nRun Code Online (Sandbox Code Playgroud)\n\n但我想导入 datetime.datetime 并执行以下操作:
\n\nimport mock\nfrom datetime import datetime\n\nclass FixedDate(datetime):\n\n @classmethod\n def now(cls):\n return cls(2010, 1, 1)\n\n@mock.patch(\'datetime\', FixedDate)\ndef myTest():\n print(datetime.now())\n\nmyTest()\nRun Code Online (Sandbox Code Playgroud)\n\n这会导致 TypeError: Need a valid target to patch. 您提供了:“日期时间”。
\n\n模拟库还指出:
\n\n\ntarget 应该是 \xe2\x80\x98package.module.ClassName\xe2\x80\x99 形式的字符串。目标被导入,指定的对象被新对象替换,因此目标必须可以从您调用补丁的环境中导入。
\n …
我正在尝试根据促销进行一些复杂的排序:自创建以来每 7 天促销一篇文章(文章在 30 天后过期)。
我的方法是用自创建以来的天数来注释查询集,但days_since_creation在我的代码中,注释字段 ( )的值始终为 0。
from datetime import timedelta
from django.test import TestCase
from django.db.models import ExpressionWrapper, F
from django.db.models.fields import IntegerField
from django.utils import timezone
from .models import Article
# class Article(models.Model):
# title = models.CharField(max_length=150)
# creation_date = models.DateTimeField()
#
# def __str__(self):
# return self.title
class ArticleTestCase(TestCase):
def test_days_since_creation(self):
now = timezone.now()
objects_data = [
Article(
title='Alrp',
creation_date=(now - timedelta(days=5)) # 5 days ago
),
Article(
title='Bopp',
creation_date=(now - timedelta(days=7)) # …Run Code Online (Sandbox Code Playgroud) datetime ×2
django ×2
python ×2
annotate ×1
python-mock ×1
pytz ×1
timezone ×1
unit-testing ×1