devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
145 lines (143 loc) • 4.82 kB
JavaScript
/**
* DevExtreme (cjs/__internal/scheduler/timezones/m_utils_timezones_data.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _math = require("../../../core/utils/math");
var _config = _interopRequireDefault(require("../../../core/config"));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const getConvertedUntils = value => value.split("|").map((until => {
if ("Infinity" === until) {
return null
}
return 1e3 * parseInt(until, 36)
}));
const parseTimezone = timeZoneConfig => {
const {
offsets: offsets
} = timeZoneConfig;
const {
offsetIndices: offsetIndices
} = timeZoneConfig;
const {
untils: untils
} = timeZoneConfig;
const offsetList = offsets.split("|").map((value => parseInt(value)));
const offsetIndexList = offsetIndices.split("").map((value => parseInt(value)));
const dateList = getConvertedUntils(untils).map((accumulator = 0, value => accumulator += value));
var accumulator;
return {
offsetList: offsetList,
offsetIndexList: offsetIndexList,
dateList: dateList
}
};
class TimeZoneCache {
constructor() {
this.map = new Map
}
tryGet(id) {
if (!this.map.get(id)) {
const config = timeZoneDataUtils.getTimezoneById(id);
if (!config) {
return false
}
const timeZoneInfo = parseTimezone(config);
this.map.set(id, timeZoneInfo)
}
return this.map.get(id)
}
}
const tzCache = new TimeZoneCache;
const timeZoneDataUtils = {
_tzCache: tzCache,
getTimeZonesOld: () => (0, _config.default)().timezones ?? [],
formatOffset(offset) {
const hours = Math.floor(offset);
const minutesInDecimal = offset - hours;
const signString = (0, _math.sign)(offset) >= 0 ? "+" : "-";
const hoursString = `0${Math.abs(hours)}`.slice(-2);
const minutesString = minutesInDecimal > 0 ? ":" + 60 * minutesInDecimal : ":00";
return signString + hoursString + minutesString
},
formatId: id => id.split("/").join(" - ").split("_").join(" "),
getTimezoneById(id) {
if (!id) {
return
}
const tzList = this.getTimeZonesOld();
for (let i = 0; i < tzList.length; i++) {
const currentId = tzList[i].id;
if (currentId === id) {
return tzList[i]
}
}
return
},
getTimeZoneOffsetById(id, timestamp) {
const timeZoneInfo = tzCache.tryGet(id);
return timeZoneInfo ? this.getUtcOffset(timeZoneInfo, timestamp) : void 0
},
getTimeZoneDeclarationTuple(id, year) {
const timeZoneInfo = tzCache.tryGet(id);
return timeZoneInfo ? this.getTimeZoneDeclarationTupleCore(timeZoneInfo, year) : []
},
getTimeZoneDeclarationTupleCore(timeZoneInfo, year) {
const {
offsetList: offsetList
} = timeZoneInfo;
const {
offsetIndexList: offsetIndexList
} = timeZoneInfo;
const {
dateList: dateList
} = timeZoneInfo;
const tupleResult = [];
for (let i = 0; i < dateList.length; i++) {
const currentDate = dateList[i];
const currentYear = new Date(currentDate).getFullYear();
if (currentYear === year) {
const offset = offsetList[offsetIndexList[i + 1]];
tupleResult.push({
date: currentDate,
offset: -offset / 60
})
}
if (currentYear > year) {
break
}
}
return tupleResult
},
getUtcOffset(timeZoneInfo, dateTimeStamp) {
const {
offsetList: offsetList
} = timeZoneInfo;
const {
offsetIndexList: offsetIndexList
} = timeZoneInfo;
const {
dateList: dateList
} = timeZoneInfo;
const lastIntervalStartIndex = dateList.length - 1 - 1;
let index = lastIntervalStartIndex;
while (index >= 0 && dateTimeStamp < dateList[index]) {
index--
}
const offset = offsetList[offsetIndexList[index + 1]];
return -offset / 60 || offset
}
};
var _default = exports.default = timeZoneDataUtils;