试图创建,其具有基于所提供的时区一个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
Object(应该是TZOFFSETFROM,TZOFFSETTO)和offsets
(DTSTART)。
然而,我无法找到如何提取这些数据清晰的文档。
想知道是否有反正是一个可以提取在那一刻,timezone.js标准时间和日光的DTSTART,TZOFFSETFROM和TZOFFSETTO
当你在问题中已经提到的,你可以使用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>
你可以在这里下载预先制作VTIMEZONE组件: