Name

sn_ex_emp_fd.eef_VTimezone

Description

No description available

Script

gs.include("eef_Moment");
gs.include("eef_MomentTimezoneWithData");

var eef_VTimezone = Class.create();
eef_VTimezone.prototype = {
  type: 'eef_VTimezone'
};

eef_VTimezone.generateDateTime = function(eventDateTime) {
      var timezoneName = gs.getSession().getTimeZoneName();
      var dateTime = this._getDate(eventDateTime) + this.formatTime(eventDateTime);
      return moment.utc(dateTime).format('YYYYMMDDTHHmmss') + 'Z';
},

eef_VTimezone.generateVTimezone = function(calStartTime, calEndTime) {
      var timezoneName = gs.getSession().getTimeZoneName(),
          tsRangeStart = moment.tz(calStartTime, timezoneName).unix() * 1000,
          tsRangeEnd = moment.tz(calEndTime, timezoneName).unix() * 1000;

      var zone = moment.tz.zone(timezoneName),
          untils = zone.untils,
          abbrs = zone.abbrs,
          offsets = zone.offsets,
          i,
          dtStart,
          utcOffsetBefore,
          utcOffsetDuring,
          periodType,
          vtz = ["X-WR-TIMEZONE:" + timezoneName, "BEGIN:VTIMEZONE", "TZID:" + timezoneName];

      tsRangeStart = tsRangeStart || 0;
      tsRangeEnd = tsRangeEnd || Math.pow(2, 31) - 1;

      // https://momentjs.com/timezone/docs/#/data-formats/unpacked-format/
      // > between `untils[n-1]` and `untils[n]`, the `abbr` should be 
      // > `abbrs[n]` and the `offset` should be `offsets[n]`
      for (i = 0; i < untils.length - 1; i++) {
          // filter to intervals that include our start/end range timestamps
          if (untils[i + 1] < tsRangeStart) continue; // interval ends before our start, skip
          if (i > 0 && untils[i - 1] > tsRangeEnd) break; // interval starts after interval we end in, break

          utcOffsetBefore = this._formatUtcOffset(offsets[i]); // offset BEFORE dtStart
          dtStart = moment.tz(untils[i], timezoneName).format('YYYYMMDDTHHmmss');
          utcOffsetDuring = this._formatUtcOffset(offsets[i + 1]); // offset AFTER dtStart
          periodType = offsets[i + 1] < offsets[i] ? 'DAYLIGHT' : 'STANDARD'; // spring-forward, DAYLIGHT, fall-back: STANDARD.

          vtz.push('BEGIN:' + periodType);
          vtz.push('DTSTART:' + dtStart); // local date-time when change
          vtz.push('TZOFFSETFROM:' + utcOffsetBefore); // utc offset BEFORE DTSTART
          vtz.push('TZOFFSETTO:' + utcOffsetDuring); // utc offset AFTER DTSTART
          vtz.push('TZNAME:' + abbrs[i + 1]);
          vtz.push('END:' + periodType);
      }
      vtz.push('END:VTIMEZONE\r\n');
      return vtz.join('\r\n'); // rfc5545 says CRLF
},

eef_VTimezone._formatUtcOffset = function(minutes) {
      var hours = Math.floor(Math.abs(minutes) / 60).toString(),
          mins = (Math.abs(minutes) % 60).toString(),
          sign = minutes > 0 ? '-' : '+', // sign inverted, see https://momentjs.com/timezone/docs/#/zone-object/offset/
          output = [sign];

      // zero-padding
      if (hours.length < 2) output.push('0');
      output.push(hours);
      if (mins.length < 2) output.push('0');
      output.push(mins);

      return output.join('');
},

/**
* Return UTC date String from @param glideDateTime
* @param glideDateTime GlideDateTime
* @return String Example: 2018-01-10 18:26:19 -> '2018:01:10'
**/
eef_VTimezone._getDate = function(glideDateTime) {
      return glideDateTime.getYearUTC() + this._prependZero(glideDateTime.getMonthUTC()) + this._prependZero(glideDateTime.getDayOfMonthUTC());
},

/**
* Return UTC time String from @param glideDateTime
* @param glideDateTime GlideDateTime
* @return String Example: 2018-01-10 18:26:19 -> 'T182619'
**/
eef_VTimezone.formatTime = function(glideDateTime) {
      var gmtTime = glideDateTime.getTime().toString().split(/\s/g);

      if (!gmtTime || gmtTime.length < 2)
          return '';

      return 'T' + gmtTime[1].replace(/:/g, '');
},

/**
* Prepends 0 to single digit numbers
* @param num number
* @return numStr String
* Example: 1 -> '01'
**/
eef_VTimezone._prependZero = function(num) {
      var numStr = '' + num;

      if (numStr.length < 2)
          numStr = '0' + numStr;

      return numStr;
};
  

Sys ID

21eca065f1fa1110fa9bd36f7a84707b

Offical Documentation

Official Docs: