django时区意识到多天和几小时

时间:2015-09-25 22:09:21

标签: django datetime timezone

我想创建一个显示锦标赛列表的网站。比赛可能每天多次进行。我举个例子:
比赛1:

  • 星期一16:00
  • 星期一18:00
  • 星期二16:00
  • 星期二18:00
  • 星期五16:00
  • 星期五18:00

我想避免两面派,所以我在日期和时间使用m2m:

class Day(models.Model):
    name = models.CharField(max_length=10)
    weekday = models.IntegerField()

    def __unicode__(self):
        return self.name

class Time(models.Model):
    time = models.TimeField()

class Tournament(models.Model):
    name = models.CharField("Tournament name", max_length=200)
    currency = models.CharField(max_length=5, choices=CURRENCIES, default='USD')
    prize = models.DecimalField(max_digits=20, decimal_places=2)
    entry = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    fee = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    password = models.CharField("password", max_length=200, null=True, blank=True)
    tournament_id = models.CharField("Tournament ID", max_length=50, null=True, blank=True)
    number_of_players = models.DecimalField(max_digits=20, decimal_places=0, default='0', null=True, blank=True)
    type = models.ManyToManyField('room.Type')
    room = models.ManyToManyField('room.Room')
    requirements_difficulty = models.IntegerField('Tournament Difficulty',validators=[MinValueValidator(1), MaxValueValidator(30)],null=True, blank=True)
    requirements_text = models.CharField("Requirements Description", default='no requirements', max_length=1000,null=True, blank=True)
    days = models.ManyToManyField(Day, related_name='days')
    times = models.ManyToManyField(Time, related_name='times')

有更多参数,但重要的是只有最后两个。我创造了时间和日子,可以根据自己的意愿添加数小时和数天。

问题在于timezone。 TimeField不是时区感知的。我希望用户选择几天甚至几小时。以某种方式可以创建此功能时区吗?

我想我可以将它分别存储在db中,然后在views.py中创建时区感知日期时间对象正确吗?这里最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您需要将天真的日期时间转换为可识别的数据时间,则可以替换其tzinfo

from datetime import datetime
import pytz


>>> _now = datetime.now()  # naive datatime
>>> _now
datetime.datetime(2015, 9, 25, 17, 18, 56, 596488)
>>> _now = _now.replace(tzinfo=pytz.timezone('America/Chicago'))  # aware datetime
>>> _now
datetime.datetime(2015, 9, 25, 17, 16, 36, 991419, tzinfo=<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>)

仅以'America/Chicago'为例,您可以使用自己的时区。

如果你想在另一个日期时间显示一个有意识的日期时间:

>>> _now
datetime.datetime(2015, 9, 25, 17, 16, 36, 991419, tzinfo=<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>)
>>> _now.astimezone(pytz.timezone('America/Lima'))
datetime.datetime(2015, 9, 25, 18, 7, 36, 991419, tzinfo=<DstTzInfo 'America/Lima' PET-1 day, 19:00:00 STD>)

最后一行将显示_nowAmerica/Chicago时区,America/Lima时间。