mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
A condition is added to check if the timezone is set as '0000' (UTC timezone), if yes then a new Date is returned with the Date.UTC method. This ensures that the time returned correctly reflects the current timezone
161 lines
3.8 KiB
TypeScript
161 lines
3.8 KiB
TypeScript
/**
|
|
* Some utils for manipulating dates
|
|
*
|
|
* **WARNING** experimental
|
|
*/
|
|
|
|
/**
|
|
* Return the date to local ISO date, like YYYY-mm-dd
|
|
*
|
|
* The date is valid for the same timezone as the date's locale
|
|
*
|
|
* Do not take time into account
|
|
*
|
|
*/
|
|
export const dateToISO = (date: Date|null): string|null => {
|
|
if (null === date) {
|
|
return null;
|
|
}
|
|
|
|
return [
|
|
date.getFullYear(),
|
|
(date.getMonth() + 1).toString().padStart(2, '0'),
|
|
date.getDate().toString().padStart(2, '0')
|
|
].join('-');
|
|
};
|
|
|
|
/**
|
|
* Return a date object from iso string formatted as YYYY-mm-dd
|
|
*
|
|
* **Experimental**
|
|
*/
|
|
export const ISOToDate = (str: string|null): Date|null => {
|
|
if (null === str) {
|
|
return null;
|
|
}
|
|
if ("" === str.trim()) {
|
|
return null;
|
|
}
|
|
|
|
let
|
|
[year, month, day] = str.split('-').map(p => parseInt(p));
|
|
|
|
return new Date(year, month-1, day, 0, 0, 0, 0);
|
|
}
|
|
|
|
/**
|
|
* Return a date object from iso string formatted as YYYY-mm-dd:HH:MM:ss+01:00
|
|
*
|
|
*/
|
|
export const ISOToDatetime = (str: string|null): Date|null => {
|
|
if (null === str) {
|
|
return null;
|
|
}
|
|
|
|
let
|
|
[cal, times] = str.split('T'),
|
|
[year, month, date] = cal.split('-').map(s => parseInt(s)),
|
|
[time, timezone] = times.split(times.charAt(8)),
|
|
[hours, minutes, seconds] = time.split(':').map(s => parseInt(s));
|
|
;
|
|
|
|
if ('0000' === timezone) {
|
|
return new Date(Date.UTC(year, month-1, date, hours, minutes, seconds));
|
|
}
|
|
|
|
return new Date(year, month-1, date, hours, minutes, seconds);
|
|
}
|
|
|
|
/**
|
|
* Convert a date to ISO8601, valid for usage in api
|
|
*
|
|
*/
|
|
export const datetimeToISO = (date: Date): string => {
|
|
let cal, time, offset;
|
|
cal = [
|
|
date.getFullYear(),
|
|
(date.getMonth() + 1).toString().padStart(2, '0'),
|
|
date.getDate().toString().padStart(2, '0')
|
|
].join('-');
|
|
|
|
time = [
|
|
date.getHours().toString().padStart(2, '0'),
|
|
date.getMinutes().toString().padStart(2, '0'),
|
|
date.getSeconds().toString().padStart(2, '0')
|
|
].join(':');
|
|
|
|
offset = [
|
|
date.getTimezoneOffset() <= 0 ? '+' : '-',
|
|
Math.abs(Math.floor(date.getTimezoneOffset() / 60)).toString().padStart(2, '0'),
|
|
':',
|
|
Math.abs(date.getTimezoneOffset() % 60).toString().padStart(2, '0'),
|
|
].join('');
|
|
|
|
let x = cal + 'T' + time + offset;
|
|
|
|
return x;
|
|
};
|
|
|
|
export const intervalDaysToISO = (days: number|string|null): string => {
|
|
if (null === days) {
|
|
return 'P0D';
|
|
}
|
|
|
|
return `P${days}D`;
|
|
}
|
|
|
|
export const intervalISOToDays = (str: string|null): number|null => {
|
|
if (null === str) {
|
|
return null
|
|
}
|
|
|
|
if ("" === str.trim()) {
|
|
return null;
|
|
}
|
|
|
|
let days = 0;
|
|
let isDate = true;
|
|
let vstring = "";
|
|
for (let i = 0; i < str.length; i = i + 1) {
|
|
if (!isDate) {
|
|
continue;
|
|
}
|
|
switch (str.charAt(i)) {
|
|
case 'P':
|
|
isDate = true;
|
|
break;
|
|
case 'T':
|
|
isDate = false;
|
|
break;
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
vstring = vstring + str.charAt(i);
|
|
break;
|
|
case 'Y':
|
|
days = days + Number.parseInt(vstring) * 365;
|
|
vstring = "";
|
|
break;
|
|
case 'M':
|
|
days = days + Number.parseInt(vstring) * 30;
|
|
vstring = "";
|
|
break;
|
|
case 'D':
|
|
days = days + Number.parseInt(vstring);
|
|
vstring = "";
|
|
break;
|
|
default:
|
|
throw Error("this character should not appears: " + str.charAt(i));
|
|
}
|
|
}
|
|
|
|
return days;
|
|
}
|