使用Moment JS使用动态VTIMEZONE生成ics

时间:2019-02-05 18:41:16

标签: momentjs icalendar moment-timezone

尝试创建一个具有VTIMEZONE组件的.ics文件,该文件根据提供的时区动态设置“标准时间”和“夏令时”。

只是一个示例:

BEGIN:VTIMEZONE
TZID:America/New_York
LAST-MODIFIED:20050809T050000Z
BEGIN:STANDARD
DTSTART:20071104T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20070311T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE

为解决这个问题,我创建了一个moment.tz.zone(timezone)对象,该对象基于时刻https://momentjs.com/timezone/docs/#/zone-object/的文档,我假设它拥有必要的数据untils(应为TZOFFSETFROM,TZOFFSETTO)和{ {1}}(DTSTART)。

但是我找不到关于如何提取这些数据的清晰文档。

想知道是否有人可以在moment-timezone.js中为标准时间和日光提取DTSTART,TZOFFSETFROM和TZOFFSETTO

2 个答案:

答案 0 :(得分:2)

您可以在此处下载预制的VTIMEZONE组件:

http://tzurl.org/

答案 1 :(得分:1)

正如您在问题中已经提到的,可以使用moment.tz.zone(name)方法。这将为您提供一个Zone对象,该对象在untils属性中包含一个时间戳列表,然后您可以应用逻辑以在VTIMEZONE中获取所需的时间戳(我已经使用过我的代码示例中untils数组的第一个时间戳)。

您可以在时间戳记上使用moment.tzformat()来获取DTSTART。您可以将ZZ令牌传递给format(),以获取TZOFFSETFROMTZOFFSETTO的偏移量。

您可以使用abbrs值来获取TZNAME

这里有一个现场样本:

const MAX_OCCUR = 2;
const getVtimezoneFromMomentZone = (tzName) => {
  const zone = moment.tz.zone(tzName);
  const header = `BEGIN:VTIMEZONE\nTZID:${tzName}`;
  const footer = 'END:VTIMEZONE';
  
  let zTZitems = '';
  for(let i=0; i<MAX_OCCUR && i+1<zone.untils.length; i++){
    const type = i%2 == 0 ? 'STANDARD' : 'DAYLIGHT';
    const momDtStart = moment.tz(zone.untils[i], tzName);
    const momNext = moment.tz(zone.untils[i+1], tzName);
    const item = 
`BEGIN:${type}
DTSTART:${momDtStart.format('YYYYMMDDTHHmmss')}
TZOFFSETFROM:${momDtStart.format('ZZ')}
TZOFFSETTO:${momNext.format('ZZ')}
TZNAME:${zone.abbrs[i]}
END:${type}\n`;
    zTZitems += item;
  }
  const result = `${header}\n${zTZitems}${footer}\n`;
  return result;
};

console.log(getVtimezoneFromMomentZone('America/New_York'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>