【问题标题】:How to create a google calendar event with local time?如何使用当地时间创建谷歌日历活动?
【发布时间】:2016-08-15 07:28:09
【问题描述】:

我正在尝试从 Google 电子表格创建 Google 日历活动:

电子表格示例:

(细节和日期不规则,所以简单的重复事件并不能安静地消除它)

代码:

function walk_sheet(){

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("CalendarGenerator");

    for (var i = 2; i <= 39; i++) {
      var date  =  sheet.getRange(i, 2).getValue();
      var start =  parseTime(sheet.getRange(i, 3).getDisplayValues().toString() ) ;
      var end   =  parseTime(sheet.getRange(i, 4).getDisplayValues().toString() ) ;
      var summary= sheet.getRange(i, 6).getValue();
      var disc  =  sheet.getRange(i, 7).getValue();

     add_bsf_event(date, start, end, summary, disc);
  } 
}

function add_bsf_event(dateIn, start, end, summary, disc){
  start_date= new Date(dateIn.getYear(), dateIn.getMonth(), dateIn.getDate(), start.getHours(), start.getMinutes(),0,0);
  end_date  = new Date(dateIn.getYear(), dateIn.getMonth(), dateIn.getDate(),   end.getHours(),   end.getMinutes(),0,0);

... 
CalendarApp.getCalendarById(calendarId).createEvent(summary, start_date, end_date);
}

它在夏令时除外。从 2017 年 3 月 13 日之后开始,Google 日历中的活动比请求晚 1 小时(下午 7:55 而不是下午 6:55)。

我试过了:

  1. 寻找可以接受本地时间的 Google 日历方法(也就是发送下午 6:55 和 Google 日历 API 将其转换为 UTC)
  2. 正在寻找将本地时间转换为 UTC 的原生 JS 方法。

没有找到任何解决方案。有没有我没有找到的或者有不同/更好的方法来解决这个问题?

【问题讨论】:

    标签: javascript google-api google-sheets google-calendar-api dst


    【解决方案1】:

    您可以尝试检查 Google Calendar API documentation,它在这里提到您可以使用单独的时区来开始和结束活动。

    现在,对于转换时区的方法,我认为tutorial 可以帮助你。它在这里逐步解释了为实现此转换需要执行的操作。

    有关更多信息,请查看此相关SO question,即使此代码是在 JAVA 中。

    【讨论】:

    • 我的问题是夏令时而不是时区(所有事件都在同一个时区)...我尝试在 Google Calendar API 中指定 start/end.timeZone 但没有效果。
    【解决方案2】:

    我的解决方案是使用 Google Calendar Ruby API 插入事件。设置起来有点痛苦,但是一旦我建立了连接并关闭了样板代码,Ruby 就可以完美地处理夏令时更改。


    Google 快速入门指南做得不错: https://developers.google.com/google-apps/calendar/quickstart/ruby

    但是,如果您在 Windows 上运行,则 SSL 证书将无法验证;您可以通过以下方式禁用它:

    require 'openssl'
    OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
    

    我用于插入事件的 Ruby 方法:

    def insert_event(summary, description, start_time, end_time, location, cal_id='primary')
        event = Google::Apis::CalendarV3::Event.new({ 
                      summary:summary,
               #color_id:5,
                    location:location,
               description:description,
                 start:{date_time:start_time.to_datetime.rfc3339},
                   end:{date_time:end_time.to_datetime.rfc3339},
             #reminders:{use_default: true} 
        })
      #puts event.to_json
      result = $service.insert_event(cal_id, event)
      #puts result
      puts "Event created: #{result.html_link}"
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多