Генерируйте ics с динамическим VTIMEZONE, используя момент js - PullRequest
0 голосов
/ 05 февраля 2019

Попытка создать файл .ics с компонентом VTIMEZONE, который на основе предоставленного часового пояса динамически устанавливает стандартное время и летнее время.

Просто пример:

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) и offsets (DTSTART).

Пока я не могу найти четкую документацию о том, как извлечь эти данные.

Интересно, можно ли в любом случае извлечь DTSTART, TZOFFSETFROM и TZOFFSETTO для стандартного времени и дневного света вмомент- timezone.js

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Как вы уже упоминали в вопросе, вы можете использовать метод moment.tz.zone(name).Это даст вам объект Zone, который содержит список временных меток в свойстве untils, затем вы можете применить свою логику, чтобы получить нужные вам временные метки в VTIMEZONE (я использовал первые временные метки *Массив 1007 * в моем примере кода).

Вы можете использовать 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>
0 голосов
/ 06 февраля 2019

Вы можете скачать готовые компоненты VTIMEZONE здесь:

http://tzurl.org/

...