/ shared / components / src / utils / date.ts
date.ts
 1  // Breaks duration down from milliseconds into hours/minutes/seconds
 2  export function getDurationParts(durationInMilliseconds: number): {
 3      hours: number;
 4      minutes: number;
 5      seconds: number;
 6  } {
 7      // convert ms to seconds
 8      const durationInSeconds = Math.floor(durationInMilliseconds / 1000);
 9      const duration = Math.round(durationInSeconds);
10  
11      return {
12          hours: Math.floor(duration / 3600),
13          minutes: Math.floor(duration / 60) % 60,
14          seconds: duration % 60,
15      };
16  }
17  
18  // returns normal numeric date in YYYY-MM-DD from a date string
19  // AKA getNumericDateFromReleaseDate but renamed to be more generic
20  //
21  // ex: getNumericDateFromDateString('2024-04-15T08:41:03Z') => '2024-04-15'
22  //     getNumericDateFromDateString('15 April 2024 14:48 UTC') => '2024-04-15'
23  export function getNumericDateFromDateString(
24      timestamp?: string,
25  ): string | undefined {
26      if (!timestamp) {
27          return undefined;
28      }
29  
30      return new Date(timestamp).toISOString().split('T')?.[0];
31  }
32  
33  // Utility to format ISO8601 Duration Strings from raw milliseconds (ex: PT2M42S).
34  export function formatISODuration(durationInMilliseconds: number): string {
35      const { hours, minutes, seconds } = getDurationParts(
36          durationInMilliseconds,
37      );
38  
39      if (!hours && !minutes && !seconds) {
40          return 'P0D';
41      }
42  
43      return [
44          'PT',
45          hours && `${hours}H`,
46          minutes && `${minutes}M`,
47          seconds && `${seconds}S`,
48      ]
49          .filter(Boolean)
50          .join('');
51  }