为什么谷歌应用脚​​本无法正确处理我的日期时间本地输入?

时间:2016-03-14 17:20:46

标签: datetime google-apps-script

我正在尝试使用datetime-local字段处理表单,以在公共Google日历中创建日历事件。但是当我运行程序时,我的所有日​​期都默认为1969年12月31日下午4点。有人有什么想法吗?

我的脚本(以“形式”作为参数):

var event = cal.createEvent(form.myTitle, new Date(form.startTime+".000Z"), new Date(form.endTime+".000Z"));
Logger.log(form.startTime+" and "+form.endTime);

我根据此解决方案添加了“.000Z”,但即使不添加它也遇到了同样的问题:Why does my Date object in Google Apps Script return NaN

将startTime和endTime记录为:

2016-03-15T17:30 and 2016-03-15T19:30

但这是执行记录:

Calendar.createEvent([NEW EVENT, Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969])

1 个答案:

答案 0 :(得分:0)

有许多方法可以在JavaScript中设置日期对象,但要为Google日历设置正确的日期,您必须以非常具体的方式执行此操作。您必须获取日历时区。对于许多人来说,如果他们的脚本的用户都在同一时区,那么代码将起作用。如果您的用户跨越不同的时区,或者脚本的时区与日历的时区不同,则会出现此问题。代码必须首先构造有效的日期字符串,然后使用日期字符串创建日期对象。你可以创建一个没有日期字符串的日期对象,这在大多数情况下会更好,因为人们可以搞乱代码来创建日期字符串,但在这种情况下,你别无选择(我知道)。为什么?这是因为时区偏移设置。时区偏移设置包含在日期字符串中。这是关键信息,可确保您的日期设置正确,包括夏令时。

function setCalendarEvent(){

  var startTime = "2016-03-15T17:30";
  var endTime = "2016-03-15T19:30";

  //Always get the time zone of the calendar.  If you don't do that, users accross different times zones will write bad dates
  var calTimeZone = CalendarApp.getDefaultCalendar().getTimeZone();

  //Construct a valid date string from the data
  var startYr = startTime.slice(0,4);
  var endYr = endTime.slice(0,4);

  var startMonth = startTime.slice(5,7);
  var endMonth = endTime.slice(5,7);

  var startDay = startTime.slice(8,10);
  var endDay = endTime.slice(8,10);

  var startHrAndMin = startTime.slice(11,17);
  var endHrAndMin = endTime.slice(11,17);

  var startDateString = startMonth + "/" + startDay + "/" + startYr + " " + startHrAndMin + ":00 ";

  var timeZoneOffset = Utilities.formatDate(new Date(startDateString),calTimeZone, "Z");

  var startDateAsDate = new Date(startDateString + " " + timeZoneOffset);

  Logger.log('startDateAsDate: ' + startDateAsDate)
};