blob: 3e1befa2036b81843eedae089fcc018f34ae2c2b [file] [log] [blame]
/*!
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global moment, $, document */
export const defaultFormat = 'YYYY-MM-DD, HH:mm:ss';
export const isoFormatWithoutTZ = 'YYYY-MM-DDTHH:mm:ss.SSS';
export const defaultFormatWithTZ = 'YYYY-MM-DD, HH:mm:ss z';
export const defaultTZFormat = 'z (Z)';
export const dateTimeAttrFormat = 'YYYY-MM-DDThh:mm:ssTZD';
export const TimezoneEvent = 'timezone';
export function formatTimezone(what) {
if (what instanceof moment) {
return what.isUTC() ? 'UTC' : what.format(defaultTZFormat);
}
if (what === 'UTC') {
return what;
}
return moment().tz(what).format(defaultTZFormat);
}
export function isoDateToTimeEl(datetime, options) {
const dateTimeObj = moment(datetime);
const addTitle = $.extend({ title: true }, options).title;
const el = document.createElement('time');
el.setAttribute('datetime', dateTimeObj.format());
if (addTitle) {
el.setAttribute('title', dateTimeObj.isUTC() ? '' : `UTC: ${dateTimeObj.clone().utc().format()}`);
}
el.innerText = dateTimeObj.format(defaultFormat);
return el;
}
export const formatDateTime = (datetime) => moment(datetime).format(defaultFormatWithTZ);
export const convertAndFormatUTC = (datetime, tz) => {
let dateTimeObj = moment.utc(datetime);
if (tz) dateTimeObj = dateTimeObj.tz(tz);
return dateTimeObj.format(defaultFormatWithTZ);
};
export const secondsToString = (seconds) => {
const numdays = Math.floor((seconds % 31536000) / 86400);
const numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);
const numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);
const numseconds = Math.floor((((seconds % 31536000) % 86400) % 3600) % 60);
return (numdays > 0 ? numdays + (numdays === 1 ? ' day ' : ' days ') : '')
+ (numhours > 0 ? numhours + (numhours === 1 ? ' hour ' : ' hours ') : '')
+ (numminutes > 0 ? numminutes + (numminutes === 1 ? ' minute ' : ' minutes ') : '')
+ (numseconds > 0 ? numseconds + (numseconds === 1 ? ' second' : ' seconds') : '');
};
export function updateAllDateTimes() {
// Called after `moment.tz.setDefault` has changed the default TZ to display.
$('time[data-datetime-convert!="false"]').each((_, el) => {
const $el = $(el);
const dt = moment($el.attr('datetime'));
// eslint-disable-next-line no-underscore-dangle
if (dt._isValid) {
$el.text(dt.format($el.data('with-tz') ? defaultFormatWithTZ : defaultFormat));
}
if ($el.attr('title') !== undefined) {
// If displayed date is not UTC, have the UTC date in a title attribute
$el.attr('title', dt.isUTC() ? '' : `UTC: ${dt.clone().utc().format()}`);
}
});
// Update any date-time inputs.
//
// Since we have set the default timezone for moment, it will automatically
// convert it to the new target for us
$('.datetime input').each((_, el) => {
el.value = moment(el.value).format();
});
}
export function setDisplayedTimezone(tz) {
moment.tz.setDefault(tz);
updateAllDateTimes();
}
// moment will resolve the enddate to now if it is undefined
export const getDuration = (startDate, endDate) => (
moment(endDate || undefined).diff(startDate || undefined)
);
export const formatDuration = (dur) => {
const duration = moment.duration(dur);
const days = duration.days();
// .as('milliseconds') is necessary for .format() to work correctly
return `${days > 0 ? `${days}d` : ''}${moment.utc(duration.as('milliseconds')).format('HH:mm:ss')}`;
};
export const approxTimeFromNow = (dur) => {
const timefromNow = moment(dur);
return `${timefromNow.fromNow()}`;
};