dateUtils.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { format } from 'date-fns'
  2. import { enUS, fr } from 'date-fns/locale'
  3. import ArrayUtils from '~/services/utils/arrayUtils'
  4. export const enum supportedLocales {
  5. FR = 'fr',
  6. EN = 'en',
  7. }
  8. const defaultLocale = 'fr'
  9. export default class DateUtils {
  10. private constructor() {
  11. // Private constructor to prevent instantiation
  12. // This utility class is not meant to be instantiated
  13. }
  14. public static format(date: Date, fmt: string): string {
  15. return format(date, fmt)
  16. }
  17. /**
  18. * Formate la ou les dates au format donné et retourne la liste concaténée
  19. *
  20. * @param dates
  21. * @param fmt
  22. * @param sep
  23. */
  24. public static formatAndConcat(
  25. dates: Date | Array<Date>,
  26. fmt: string,
  27. sep: string = ' - ',
  28. ): string {
  29. dates = Array.isArray(dates) ? dates : [dates]
  30. return dates.map((d) => this.format(d, fmt)).join(sep)
  31. }
  32. /**
  33. * Trie les dates par ordre chronologique
  34. *
  35. * @param dates
  36. * @param reverse
  37. */
  38. public static sort(
  39. dates: Array<Date>,
  40. reverse: boolean = false,
  41. ): Array<Date> {
  42. return ArrayUtils.sort(dates, reverse) as Array<Date>
  43. }
  44. public static getFnsLocale(code: supportedLocales): Locale {
  45. // noinspection TypeScriptUnresolvedReference
  46. const mapping = {
  47. en: enUS,
  48. fr,
  49. }
  50. return mapping[code] ?? mapping[defaultLocale]
  51. }
  52. public static getShortFormatPattern(code: supportedLocales): string {
  53. const mapping = {
  54. en: 'MM/dd/yyyy',
  55. fr: 'dd/MM/yyyy',
  56. }
  57. return mapping[code] ?? mapping[defaultLocale]
  58. }
  59. public static getFormatPattern(code: supportedLocales): string {
  60. const mapping = {
  61. en: 'MM/dd/yyyy HH:mm',
  62. fr: 'dd/MM/yyyy HH:mm',
  63. }
  64. return mapping[code] ?? mapping[defaultLocale]
  65. }
  66. public static formatIsoShortDate(date: Date): string {
  67. return format(date, 'yyyy-MM-dd')
  68. }
  69. public static combineDateAndTime(date: Date = new Date(), time: string = '00:00'): Date {
  70. const [hours, minutes] = time.split(':').map(Number)
  71. const result = new Date(date)
  72. result.setHours(hours)
  73. result.setMinutes(minutes)
  74. result.setSeconds(0)
  75. result.setMilliseconds(0)
  76. return result
  77. }
  78. public static isBefore(dateA: string, dateB: string, strictly = true): boolean {
  79. const a = new Date(dateA)
  80. const b = new Date(dateB)
  81. if (isNaN(a.getTime()) || isNaN(b.getTime())) {
  82. throw new Error('Invalid date format')
  83. }
  84. return strictly ? a.getTime() < b.getTime() : a.getTime() <= b.getTime()
  85. }
  86. }