2

背景:通过 Cloud Scheduler 触发 CF:下图:它计划在澳大利亚/悉尼时间早上 7 点运行并触发两个云功能:

在此处输入图像描述

云功能:区域是 us-central1。使用的代码:

# Global variable:

tz=pytz.timezone('Australia/Sydney')
naive_dt = datetime.now(tz=tz)
since = datetime.strftime(naive_dt - timedelta(1), '%Y-%m-%d') #yesterday's date 
until = datetime.strftime(naive_dt - timedelta(1), '%Y-%m-%d') #yesterday's date 

def honda_reporting_automation(event,context):

    print("New Day")
    print("current Function Execution date time",naive_dt)
    print("since",since)
    print("until",until)

奇怪的云功能行为: 1. 虽然云调度程序在早上 7:00 触发作业,并且我在代码中将服务器时间设置为本地时间,但执行时间仍然不同。它需要美国时间(1 天滞后)(下图)

在此处输入图像描述

  1. 第二个云函数显示不同的启动时间(与第一个相差 4 分钟),但由同一个调度程序同时触发。

在此处输入图像描述

  1. 当使用“立即运行”选项通过 Cloud Scheduler 手动触发时,它们会按预期运行并显示正确的时间安排。(图3)

在此处输入图像描述

有人遇到过这种奇怪的行为吗?以及如何解决它的任何想法?

4

1 回答 1

4

这里有什么错误?您要求该功能在 AEDT 7:00 执行,并且此时正在执行。Cloud Function 运行的服务器位于美国中央,因此系统向 stackdriver 发送的日志将反映该时区。由于 Cloud Functions 是无服务器产品,因此您无法修改执行该功能的机器的时区。

同样根据pytz 文档,您没有正确转换时间。

你应该使用类似的东西:

naive_dt = datetime.now(timezone(tz))

代替:

naive_dt = datetime.now(tz=tz)

这是我的代码工作的示例:

from pytz import timezone
from datetime import datetime
import pytz

def hello_world(request):
    fmt = "%Y-%m-%d %H:%M:%S %Z%z"
    nowutc = datetime.now(timezone('UTC'))
    now_australia = nowutc.astimezone(timezone('Australia/Sydney'))
    print(now_australia.strftime(fmt))

    request_json = request.get_json()
    if request.args and 'message' in request.args:
        return request.args.get('message')
    elif request_json and 'message' in request_json:
        return request_json['message']
    else:
        return str(now_australia.strftime(fmt))

日志:

在此处输入图像描述

于 2020-02-26T09:38:33.960 回答