date.formatter.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * DevExtreme (localization/ldml/date.formatter.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. function leftPad(text, length) {
  11. while (text.length < length) {
  12. text = "0" + text
  13. }
  14. return text
  15. }
  16. var FORMAT_TYPES = {
  17. 3: "abbreviated",
  18. 4: "wide",
  19. 5: "narrow"
  20. };
  21. var LDML_FORMATTERS = {
  22. y: function(date, count, useUtc) {
  23. var year = date[useUtc ? "getUTCFullYear" : "getFullYear"]();
  24. if (2 === count) {
  25. year %= 100
  26. }
  27. return leftPad(year.toString(), count)
  28. },
  29. M: function(date, count, useUtc, dateParts) {
  30. var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
  31. var formatType = FORMAT_TYPES[count];
  32. if (formatType) {
  33. return dateParts.getMonthNames(formatType, "format")[month]
  34. }
  35. return leftPad((month + 1).toString(), Math.min(count, 2))
  36. },
  37. L: function(date, count, useUtc, dateParts) {
  38. var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
  39. var formatType = FORMAT_TYPES[count];
  40. if (formatType) {
  41. return dateParts.getMonthNames(formatType, "standalone")[month]
  42. }
  43. return leftPad((month + 1).toString(), Math.min(count, 2))
  44. },
  45. Q: function(date, count, useUtc, dateParts) {
  46. var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
  47. var quarter = Math.floor(month / 3);
  48. var formatType = FORMAT_TYPES[count];
  49. if (formatType) {
  50. return dateParts.getQuarterNames(formatType)[quarter]
  51. }
  52. return leftPad((quarter + 1).toString(), Math.min(count, 2))
  53. },
  54. E: function(date, count, useUtc, dateParts) {
  55. var day = date[useUtc ? "getUTCDay" : "getDay"]();
  56. var formatType = FORMAT_TYPES[count < 3 ? 3 : count];
  57. return dateParts.getDayNames(formatType)[day]
  58. },
  59. a: function(date, count, useUtc, dateParts) {
  60. var hours = date[useUtc ? "getUTCHours" : "getHours"]();
  61. var period = hours < 12 ? 0 : 1;
  62. var formatType = FORMAT_TYPES[count];
  63. return dateParts.getPeriodNames(formatType)[period]
  64. },
  65. d: function(date, count, useUtc) {
  66. return leftPad(date[useUtc ? "getUTCDate" : "getDate"]().toString(), Math.min(count, 2))
  67. },
  68. H: function(date, count, useUtc) {
  69. return leftPad(date[useUtc ? "getUTCHours" : "getHours"]().toString(), Math.min(count, 2))
  70. },
  71. h: function(date, count, useUtc) {
  72. var hours = date[useUtc ? "getUTCHours" : "getHours"]();
  73. return leftPad((hours % 12 || 12).toString(), Math.min(count, 2))
  74. },
  75. m: function(date, count, useUtc) {
  76. return leftPad(date[useUtc ? "getUTCMinutes" : "getMinutes"]().toString(), Math.min(count, 2))
  77. },
  78. s: function(date, count, useUtc) {
  79. return leftPad(date[useUtc ? "getUTCSeconds" : "getSeconds"]().toString(), Math.min(count, 2))
  80. },
  81. S: function(date, count, useUtc) {
  82. return leftPad(date[useUtc ? "getUTCMilliseconds" : "getMilliseconds"]().toString(), 3).substr(0, count)
  83. },
  84. x: function(date, count, useUtc) {
  85. var timezoneOffset = useUtc ? 0 : date.getTimezoneOffset();
  86. var signPart = timezoneOffset > 0 ? "-" : "+";
  87. var timezoneOffsetAbs = Math.abs(timezoneOffset);
  88. var hours = Math.floor(timezoneOffsetAbs / 60);
  89. var minutes = timezoneOffsetAbs % 60;
  90. var hoursPart = leftPad(hours.toString(), 2);
  91. var minutesPart = leftPad(minutes.toString(), 2);
  92. return signPart + hoursPart + (count >= 3 ? ":" : "") + (count > 1 || minutes ? minutesPart : "")
  93. },
  94. X: function(date, count, useUtc) {
  95. if (useUtc || !date.getTimezoneOffset()) {
  96. return "Z"
  97. }
  98. return LDML_FORMATTERS.x(date, count, useUtc)
  99. },
  100. Z: function(date, count, useUtc) {
  101. return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc)
  102. }
  103. };
  104. var getFormatter = function(format, dateParts) {
  105. return function(date) {
  106. var charIndex;
  107. var formatter;
  108. var char;
  109. var charCount = 0;
  110. var separator = "'";
  111. var isEscaping = false;
  112. var isCurrentCharEqualsNext;
  113. var result = "";
  114. if (!date) {
  115. return null
  116. }
  117. if (!format) {
  118. return date
  119. }
  120. var useUtc = "Z" === format[format.length - 1] || "'Z'" === format.slice(-3);
  121. for (charIndex = 0; charIndex < format.length; charIndex++) {
  122. char = format[charIndex];
  123. formatter = LDML_FORMATTERS[char];
  124. isCurrentCharEqualsNext = char === format[charIndex + 1];
  125. charCount++;
  126. if (!isCurrentCharEqualsNext) {
  127. if (formatter && !isEscaping) {
  128. result += formatter(date, charCount, useUtc, dateParts)
  129. }
  130. charCount = 0
  131. }
  132. if (char === separator && !isCurrentCharEqualsNext) {
  133. isEscaping = !isEscaping
  134. } else {
  135. if (isEscaping || !formatter) {
  136. result += char
  137. }
  138. }
  139. if (char === separator && isCurrentCharEqualsNext) {
  140. charIndex++
  141. }
  142. }
  143. return result
  144. }
  145. };
  146. module.exports.getFormatter = getFormatter;