簡體   English   中英

為什么 Google Calendar API 會比我使用 Node.js 提供的日期/時間早 4 小時插入我的活動?

[英]Why does Google Calendar API insert my event 4 hours earlier than the date/time that I've given it using Node.js?

我終於得到了谷歌日歷 api,可以使用 Node.js 將事件插入我的日歷,但該事件比我給它的開始時間早 4 小時插入。

這是我為插入它所做的工作。 在此示例中:日期變量為“2022-05-18”,時間變量為“17:18”,然后當我控制台記錄 apptDate 變量時,輸出為 2022-05-18T17:18:00.000Z

但該活動已於 2022 年 5 月 18 日 13:18 插入我的日歷中。

export const insertGoogleCalendarEvent = async (req, res)=> {
    try{
    const {firstName, lastName, date, time, duration} = req.body

    const apptDate = new Date(`${date}T${time}:00.000Z`).toISOString()

    const SCOPES = ['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.events']
    const GOOGLE_PRIVATE_KEY = process.env.GOOGLE_PRIVATE_KEY
    const GOOGLE_CLIENT_EMAIL = process.env.GOOGLE_CLIENT_EMAIL
    const GOOGLE_PROJECT_NUMBER = process.env.GOOGLE_PROJECT_NUMBER
    const GOOGLE_CALENDAR_ID = process.env.GOOGLE_CALENDAR_ID

    let endDateTime = ''
    if (duration === '60') {
        let newDate = new Date(apptDate)
        newDate.setHours(newDate.getHours() + 1)
        endDateTime = newDate.toISOString()
    } else if (duration === '75') {
        let newDate = new Date(apptDate)
        newDate.setMinutes(newDate.getMinutes() + 75)
        endDateTime = newDate.toISOString()
    } else if (duration === '90') {
        let newDate = new Date(apptDate)
        newDate.setMinutes(newDate.getMinutes() + 90)
        endDateTime = newDate.toISOString()
    }

    const event = {
        'summary': `${firstName} ${lastName}`,
        'start': {
            'dateTime': `${apptDate}`,
            'timeZone': 'Canada/Eastern'
        },
        'end': {
            'dateTime': `${endDateTime}`,
            'timeZone': 'Canada/Eastern'
        }
    }

    const jwtClient = new google.auth.JWT(
        GOOGLE_CLIENT_EMAIL,
        null,
        GOOGLE_PRIVATE_KEY,
        SCOPES
    )

    const calendar = google.calendar({
        version: 'v3',
        project: GOOGLE_PROJECT_NUMBER,
        auth: jwtClient
    })

    
        calendar.events.insert({
            calendarId: GOOGLE_CALENDAR_ID,
            resource: event,
        }, {
            function (err, event) {
                if (err) {
                    console.log('this is an error', err)
                    return
                }
                console.log('Event created:', event.htmlLink);
            }
        })
    } catch {
        console.log('error')
    }
}

一個原因可能是appDate變量末尾的.00Z部分,因為它指的是UTC時區(Z 表示 UTC 或祖魯時間)。 嘗試在末尾使用格式-04:00 (加拿大/東部)設置所需的時區。

例子

const apptDate = new Date(`${date}T${time}:00-04:00`).toISOString()

更新

再次查看問題后,我認為 API 將您在apptDate變量( .000Z ,UTC)中設置的日期和時間調整為您在timeZone選項中指定的時區。 在這種情況下,它是Canada/Eastern ,UTC-4 小時,因此它從您設置的時間中刪除了 4 小時。

dateTime文檔說

時間,作為組合的日期時間值(根據 RFC3339 格式化)。 除非在 timeZone 中明確指定時區,否則需要時區偏移量。

因此,更簡潔的方法是按原樣使用apptDate (UTC),而不使用timeZone選項。

例子

const apptDate = new Date(`${date}T${time}:00.000Z`).toISOString()

...

'start': {
        'dateTime': `${apptDate}`
    },
    'end': {
        'dateTime': `${endDateTime}`
    }

更多信息

日歷 API 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM