产生与使用动态VTIMEZONE时刻JS的IC

问题描述 投票:0回答:2

试图创建,其具有基于所提供的时区一个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/的文档上untilsObject(应该是TZOFFSETFROM,TZOFFSETTO)和offsets(DTSTART)。

然而,我无法找到如何提取这些数据清晰的文档。

想知道是否有反正是一个可以提取在那一刻,timezone.js标准时间和日光的DTSTART,TZOFFSETFROM和TZOFFSETTO

momentjs icalendar moment-timezone
2个回答
2
投票

当你在问题中已经提到的,你可以使用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>

3
投票

你可以在这里下载预先制作VTIMEZONE组件:

http://tzurl.org/

© www.soinside.com 2019 - 2024. All rights reserved.