install
import momentDurationFormatSetup from "moment-duration-format";
import moment from "moment-timezone";
momentDurationFormatSetup(moment);
utils.ts
function formatTimezone(name: string) {
const tz = moment.tz(name);
const zoneAbbr = tz.zoneAbbr();
const offset = tz.utcOffset();
const offsetStr =
(offset >= 0 ? "+" : "") + moment.duration(offset, "minutes").format("hh:mm", { trim: false });
if (name === zoneAbbr) {
return `${zoneAbbr} (${offsetStr})`;
}
return `${name} (${zoneAbbr}, ${offsetStr})`;
}
/**
* filterMap creates a new array populated with the results of calling a provided function on every
* element in the calling array. Results which resolve to a javascript "false" value are discarded
* from the array.
*
* This is a more efficient version of [...values].map(mapFn).filter(Boolean) that avoids two
* iterations of the array.
*/
export default function filterMap<T, U>(
values: Iterable<T>,
mapFn: (arg0: T, arg1: number) => U | undefined,
): U[] {
const results: Array<U> = [];
let index = 0;
for (const item of values) {
const mappedItem = mapFn(item, index++);
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (mappedItem) {
results.push(mappedItem);
}
}
return results;
}
// 当前地区
console.log({
key: "detect",
label: `Detect from system: ${formatTimezone(moment.tz.guess())}`,
data: undefined,
})
、、
console.log({ key: "zone:UTC", label: `${formatTimezone("UTC")}`, data: "UTC" });
const timezones = filterMap(moment.tz.names(), (name) => {
// UTC is always hoisted to the top in fixedItems
if (name === "UTC") {
return undefined;
}
return { key: `zone:${name}`, label: formatTimezone(name), data: name };
})
console.log(timezones);
参考:@foxglove/den/collection;