gpt4 book ai didi

python - 在不同时区安排

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:08 25 4
gpt4 key购买 nike

我正在开发一个 Django 项目。

我想自动同步类(class)。

我的代码:

from datetime import timedelta
from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
'sync-classes': {
'task': 'scheduler.tasks.sync_classes',
'schedule': crontab(hour='0', minute=0),
}

CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Europe/London'

它适用于伦敦时区。

每个类(class)都有不同的时区。我希望时间表根据类(class)的相关时区自动运行。

sync_classes() 方法中,我获取所有类并在伦敦时区同步它。

问题:如何根据时区同步每个类(class)?

最佳答案

当涉及到 Django/Celery 部分时,此代码未经测试,但想法如下:

  1. 将 Celery-Beat 的时间表更改为每 15 分钟运行一次。那应该差不多涵盖all the TZ offsets in existence因为大多数要么是小时的倍数,要么是半小时的倍数,只有少数情况是一刻钟的倍数(所以这个 15 分钟的分辨率应该涵盖所有世界的时区偏移) :

    CELERYBEAT_SCHEDULE = {
    'sync-classes': {
    'task': 'scheduler.tasks.sync_classes',
    'schedule': crontab(minute='*/15'),
    }

    CELERY_ENABLE_UTC = False
    CELERY_TIMEZONE = 'Europe/London'

    此时,Celery 的时区并不重要,因为我们将使用唯一的合适 时区作为引用:UTC。

  2. 创建一个辅助函数,它将为您提供现在所在的时区名称(“现在” 意思是“当您的任务运行时“) 是“几乎”午夜。您的任务将每 15 分钟运行一次……也许在 15 分钟标记后几毫秒……所以让我们给它 10 分钟的缓冲时间(这应该足够了,方式绰绰有余)。只要缓冲时间少于 15 分钟,您就应该没问题(没问题 意味着您不会有一个任务,而下一个任务认为“现在” 是午夜因此运行同步两次)

    这应该有帮助:

    import pytz
    import datetime

    utc_now = pytz.utc.localize(datetime.datetime.utcnow())
    collected_tz_names = []
    for tz in pytz.all_timezones_set:
    test_dt = utc_now.astimezone(pytz.timezone(tz))
    print("tz: %s, test_dt.time() %s" % (tz, test_dt.time()))
    is_midnight = (
    datetime.time(hour=0, minute=0, second=0) <=
    test_dt.time() <=
    datetime.time(hour=0, minute=10, second=0)
    )
    if is_midnight:
    collected_tz_names.append(tz)
    print("collected %s" % collected_tz_names)

    如果要测试它,请将 utc_now = pytz.utc.localize(datetime.datetime.utcnow())“探测”(或引用)更改为一些手动值,例如utc_now = pytz.utc.localize(datetime.datetime(year=2018, month=1, day=4, hour=4, minute=1, second=0))

    <
  3. 一旦您在collected_tz_names 列表中收集了现在午夜 的时区,运行您的同步方法。假设您需要同步的对象是 User,对吗?并且您的 User 模型有一个属性 tz_name 指示哪个是每个用户的时区。在这种情况下,应该这样做:

    for user in User.objects.filter(tz_name__in=collected_tz_names):
    user.synchronize()

请记住,在夏令时切换中,您最终可能会同步两次。

关于python - 在不同时区安排,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48089414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com