@edugouvfr/ngx-dsfr
Version:
NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).
111 lines • 15.4 kB
JavaScript
/**
* @since 0.7
*/
export class DateUtils {
constructor() { }
/**
* Transforme un string représentant une date au format `'dd/mm/yyyy'` en objet `Date`.
* Le siècle peut-être sur 2 digits, dans ce cas, cela correspond à `'19yy'`.
* @returns Date ou undefined
*/
static parseDateFr(dateStr) {
const regexp = /^(?<day>3[01]|0?[1-9]|[12][0-9])\/(?<month>1[0-2]|0?[1-9])\/(?<year>[0-9]{4})$/;
return DateUtils.parseDate(dateStr, regexp);
}
/**
* Transforme un string représentant une date au format ISO 8601 en objet `Date`.
* @returns Date ou undefined
*/
static parseDateIso(dateStr, withHours = false) {
// https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html
const regexp = /^(?<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?<month>1[0-2]|0[1-9])-(?<day>3[01]|0[1-9]|[12][0-9])(T(?<hour>2[0-4]|[01][0-9]):(?<minute>[0-5][0-9]):(?<second>[0-5][0-9])(?<ms>\.[0-9]+)?(?<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?)?$/;
return DateUtils.parseDate(dateStr, regexp, withHours);
}
/**
* Retourne une Date UTC, sans heure, minute seconde, à partir d'une date
* @param date
*/
static date2Utc(date, withHours = false) {
if (withHours) {
return this.createDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours());
}
else {
return this.createDate(date.getFullYear(), date.getMonth(), date.getDate());
}
}
/**
* Retourne une Date UTC, sans heure, minute seconde, selon plusieurs formats en entrée
* @param value
*/
static dateUtcOf(value) {
let date = undefined;
if (typeof value === 'string')
date = DateUtils.parseDateIso(value);
else if (typeof value === 'number')
date = DateUtils.numberToDateUtc(value);
else if (value)
date = DateUtils.date2Utc(value);
return date;
}
/**
* Retourne une Date UTC, sans minute et seconde, selon plusieurs formats en entrée
* @param value
*/
static dateUtcOfWithHours(value) {
let date = undefined;
if (typeof value === 'string')
date = DateUtils.parseDateIso(value, true);
else if (typeof value === 'number')
date = DateUtils.numberToDateUtc(value, true);
else if (value)
date = DateUtils.date2Utc(value, true);
return date;
}
static isTwoDigitsYear(year) {
return year >= 0 && year < 100;
}
/**
* Permet de créer une date avec un année contenant seulement un ou deux digits (i.e: année 27)
*
* @param year Année, possiblement négative.
* @param month Mois
* @param day Jour
* @param hour Heure
* @param needsOffsetting Défini si la date créée à besoin d'être basculée à minuit, heure locale
* @returns La date correspondant aux paramètres d'entrée
*/
static createDate(year, month, day, hour = 0, needsOffsetting = true) {
const date = needsOffsetting ? new Date(Date.UTC(year, month, day, hour)) : new Date(year, month, day, hour);
if (this.isTwoDigitsYear(year)) {
date.setFullYear(year);
}
return date;
}
static parseDate(dateStr, regexp, withHours = false) {
if (!dateStr)
return undefined;
const execArr = regexp.exec(dateStr);
const groups = execArr?.groups;
const valid = !!groups && !!groups['year'] && !!groups['month'] && !!groups['day'];
if (!valid) {
return undefined;
}
else if (withHours) {
const offset = groups['timezone'] === 'Z' ? 0 : Number(groups['timezone'].split(':')[0]);
return this.createDate(Number(groups['year']), Number(groups['month']) - 1, Number(groups['day']), Number(groups['hour']) + offset);
}
else {
return this.createDate(Number(groups['year']), Number(groups['month']) - 1, Number(groups['day']));
}
}
static numberToDateUtc(n, withHours = false) {
const d = new Date(n);
if (withHours) {
return this.createDate(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());
}
else {
return this.createDate(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvdXRpbHMvZGF0ZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBQ3BCLGdCQUF1QixDQUFDO0lBRXhCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsTUFBTSxNQUFNLEdBQUcsZ0ZBQWdGLENBQUM7UUFDaEcsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDcEQsK0ZBQStGO1FBQy9GLE1BQU0sTUFBTSxHQUNWLDBPQUEwTyxDQUFDO1FBRTdPLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVUsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUMzQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENB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Q29udGVudCI6WyIvKipcbiAqIEBzaW5jZSAwLjdcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGVVdGlscyB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1lIHVuIHN0cmluZyByZXByw6lzZW50YW50IHVuZSBkYXRlIGF1IGZvcm1hdCBgJ2RkL21tL3l5eXknYCBlbiBvYmpldCBgRGF0ZWAuXG4gICAqIExlIHNpw6hjbGUgcGV1dC3DqnRyZSBzdXIgMiBkaWdpdHMsIGRhbnMgY2UgY2FzLCBjZWxhIGNvcnJlc3BvbmQgw6AgYCcxOXl5J2AuXG4gICAqIEByZXR1cm5zIERhdGUgb3UgdW5kZWZpbmVkXG4gICAqL1xuICBzdGF0aWMgcGFyc2VEYXRlRnIoZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnZXhwID0gL14oPzxkYXk+M1swMV18MD9bMS05XXxbMTJdWzAtOV0pXFwvKD88bW9udGg+MVswLTJdfDA/WzEtOV0pXFwvKD88eWVhcj5bMC05XXs0fSkkLztcbiAgICByZXR1cm4gRGF0ZVV0aWxzLnBhcnNlRGF0ZShkYXRlU3RyLCByZWdleHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybWUgdW4gc3RyaW5nIHJlcHLDqXNlbnRhbnQgdW5lIGRhdGUgYXUgZm9ybWF0IElTTyA4NjAxIGVuIG9iamV0IGBEYXRlYC5cbiAgICogQHJldHVybnMgRGF0ZSBvdSB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBwYXJzZURhdGVJc28oZGF0ZVN0cjogc3RyaW5nLCB3aXRoSG91cnMgPSBmYWxzZSk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIC8vIGh0dHBzOi8vd3d3Lm9yZWlsbHkuY29tL2xpYnJhcnkvdmlldy9yZWd1bGFyLWV4cHJlc3Npb25zLWNvb2tib29rLzk3ODE0NDkzMjc0NTMvY2gwNHMwNy5odG1sXG4gICAgY29uc3QgcmVnZXhwID1cbiAgICAgIC9eKD88eWVhcj4tPyg/OlsxLTldWzAtOV0qKT9bMC05XXs0fSktKD88bW9udGg+MVswLTJdfDBbMS05XSktKD88ZGF5PjNbMDFdfDBbMS05XXxbMTJdWzAtOV0pKFQoPzxob3VyPjJbMC00XXxbMDFdWzAtOV0pOig/PG1pbnV0ZT5bMC01XVswLTldKTooPzxzZWNvbmQ+WzAtNV1bMC05XSkoPzxtcz5cXC5bMC05XSspPyg/PHRpbWV6b25lPlp8WystXSg/OjJbMC0zXXxbMDFdWzAtOV0pOlswLTVdWzAtOV0pPyk/JC87XG5cbiAgICByZXR1cm4gRGF0ZVV0aWxzLnBhcnNlRGF0ZShkYXRlU3RyLCByZWdleHAsIHdpdGhIb3Vycyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgdW5lIERhdGUgVVRDLCBzYW5zIGhldXJlLCBtaW51dGUgc2Vjb25kZSwgw6AgcGFydGlyIGQndW5lIGRhdGVcbiAgICogQHBhcmFtIGRhdGVcbiAgICovXG4gIHN0YXRpYyBkYXRlMlV0YyhkYXRlOiBEYXRlLCB3aXRoSG91cnMgPSBmYWxzZSk6IERhdGUge1xuICAgIGlmICh3aXRoSG91cnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldEhvdXJzKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG91cm5lIHVuZSBEYXRlIFVUQywgc2FucyBoZXVyZSwgbWludXRlIHNlY29uZGUsIHNlbG9uIHBsdXNpZXVycyBmb3JtYXRzIGVuIGVudHLDqWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgZGF0ZVV0Y09mKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIGRhdGUgPSBEYXRlVXRpbHMucGFyc2VEYXRlSXNvKHZhbHVlKTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBkYXRlID0gRGF0ZVV0aWxzLm51bWJlclRvRGF0ZVV0Yyh2YWx1ZSk7XG4gICAgZWxzZSBpZiAodmFsdWUpIGRhdGUgPSBEYXRlVXRpbHMuZGF0ZTJVdGModmFsdWUpO1xuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgdW5lIERhdGUgVVRDLCBzYW5zIG1pbnV0ZSBldCBzZWNvbmRlLCBzZWxvbiBwbHVzaWV1cnMgZm9ybWF0cyBlbiBlbnRyw6llXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGRhdGVVdGNPZldpdGhIb3Vycyh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSBkYXRlID0gRGF0ZVV0aWxzLnBhcnNlRGF0ZUlzbyh2YWx1ZSwgdHJ1ZSk7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgZGF0ZSA9IERhdGVVdGlscy5udW1iZXJUb0RhdGVVdGModmFsdWUsIHRydWUpO1xuICAgIGVsc2UgaWYgKHZhbHVlKSBkYXRlID0gRGF0ZVV0aWxzLmRhdGUyVXRjKHZhbHVlLCB0cnVlKTtcblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgc3RhdGljIGlzVHdvRGlnaXRzWWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4geWVhciA+PSAwICYmIHllYXIgPCAxMDA7XG4gIH1cblxuICAvKipcbiAgICogUGVybWV0IGRlIGNyw6llciB1bmUgZGF0ZSBhdmVjIHVuIGFubsOpZSBjb250ZW5hbnQgc2V1bGVtZW50IHVuIG91IGRldXggZGlnaXRzIChpLmU6IGFubsOpZSAyNylcbiAgICpcbiAgICogQHBhcmFtIHllYXIgQW5uw6llLCBwb3NzaWJsZW1lbnQgbsOpZ2F0aXZlLlxuICAgKiBAcGFyYW0gbW9udGggTW9pc1xuICAgKiBAcGFyYW0gZGF5IEpvdXJcbiAgICogQHBhcmFtIGhvdXIgSGV1cmVcbiAgICogQHBhcmFtIG5lZWRzT2Zmc2V0dGluZyBEw6lmaW5pIHNpIGxhIGRhdGUgY3LDqcOpZSDDoCBiZXNvaW4gZCfDqnRyZSBiYXNjdWzDqWUgw6AgbWludWl0LCBoZXVyZSBsb2NhbGVcbiAgICogQHJldHVybnMgTGEgZGF0ZSBjb3JyZXNwb25kYW50IGF1eCBwYXJhbcOodHJlcyBkJ2VudHLDqWVcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVEYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIsIGhvdXI6IG51bWJlciA9IDAsIG5lZWRzT2Zmc2V0dGluZyA9IHRydWUpOiBEYXRlIHtcbiAgICBjb25zdCBkYXRlID0gbmVlZHNPZmZzZXR0aW5nID8gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91cikpIDogbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgaG91cik7XG5cbiAgICBpZiAodGhpcy5pc1R3b0RpZ2l0c1llYXIoeWVhcikpIHtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nLCByZWdleHA6IFJlZ0V4cCwgd2l0aEhvdXJzID0gZmFsc2UpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWRhdGVTdHIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBleGVjQXJyID0gcmVnZXhwLmV4ZWMoZGF0ZVN0cik7XG4gICAgY29uc3QgZ3JvdXBzID0gZXhlY0Fycj8uZ3JvdXBzO1xuICAgIGNvbnN0IHZhbGlkID0gISFncm91cHMgJiYgISFncm91cHNbJ3llYXInXSAmJiAhIWdyb3Vwc1snbW9udGgnXSAmJiAhIWdyb3Vwc1snZGF5J107XG5cbiAgICBpZiAoIXZhbGlkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAod2l0aEhvdXJzKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBncm91cHNbJ3RpbWV6b25lJ10gPT09ICdaJyA/IDAgOiBOdW1iZXIoZ3JvdXBzWyd0aW1lem9uZSddLnNwbGl0KCc6JylbMF0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVEYXRlKFxuICAgICAgICBOdW1iZXIoZ3JvdXBzWyd5ZWFyJ10pLFxuICAgICAgICBOdW1iZXIoZ3JvdXBzWydtb250aCddKSAtIDEsXG4gICAgICAgIE51bWJlcihncm91cHNbJ2RheSddKSxcbiAgICAgICAgTnVtYmVyKGdyb3Vwc1snaG91ciddKSArIG9mZnNldCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoTnVtYmVyKGdyb3Vwc1sneWVhciddKSwgTnVtYmVyKGdyb3Vwc1snbW9udGgnXSkgLSAxLCBOdW1iZXIoZ3JvdXBzWydkYXknXSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG51bWJlclRvRGF0ZVV0YyhuOiBudW1iZXIsIHdpdGhIb3VycyA9IGZhbHNlKTogRGF0ZSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKG4pO1xuXG4gICAgaWYgKHdpdGhIb3Vycykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCksIGQuZ2V0SG91cnMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoZC5nZXRVVENGdWxsWWVhcigpLCBkLmdldFVUQ01vbnRoKCksIGQuZ2V0VVRDRGF0ZSgpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==