尝试创建一个具有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
答案 0 :(得分:2)
您可以在此处下载预制的VTIMEZONE组件:
答案 1 :(得分:1)
正如您在问题中已经提到的,可以使用moment.tz.zone(name)
方法。这将为您提供一个Zone
对象,该对象在untils
属性中包含一个时间戳列表,然后您可以应用逻辑以在VTIMEZONE
中获取所需的时间戳(我已经使用过我的代码示例中untils
数组的第一个时间戳)。
您可以在时间戳记上使用moment.tz
和format()
来获取DTSTART
。您可以将ZZ
令牌传递给format()
,以获取TZOFFSETFROM
和TZOFFSETTO
的偏移量。
您可以使用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>