format.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // utils/format.js — 通用格式化工具(时间/金额)
  2. // 规范:后端金额以「分」为单位整数返回,前端除以 100 转「元」展示
  3. // 时间:后端返回 ISO 8601(2026-08-15T14:30:00),统一转为 yyyy-MM-dd HH:mm:ss
  4. /**
  5. * 解析 ISO 8601 时间为本地 Date,兼容 iOS(不能用 new Date('yyyy-MM-dd HH:mm:ss'))
  6. * @param {String} str ISO 时间串,如 '2026-08-15T14:30:00'
  7. * @returns {Date|null}
  8. */
  9. export function parseDate(str) {
  10. if (!str) return null
  11. if (typeof str !== 'string') return null
  12. // 将 'yyyy-MM-dd HH:mm:ss' / 'yyyy-MM-ddTHH:mm:ss' 统一转成 iOS 可解析格式
  13. var normalized = str.replace('T', ' ').trim()
  14. // 去掉毫秒与时区后缀(若有)
  15. normalized = normalized.replace(/\.\d+/, '')
  16. normalized = normalized.replace(/Z$/, '')
  17. // 纯日期补零时分秒
  18. if (/^\d{4}-\d{2}-\d{2}$/.test(normalized)) {
  19. normalized += ' 00:00:00'
  20. }
  21. var d = new Date(normalized.replace(/-/g, '/'))
  22. if (isNaN(d.getTime())) {
  23. d = new Date(normalized)
  24. }
  25. return isNaN(d.getTime()) ? null : d
  26. }
  27. function pad(n) {
  28. return n < 10 ? '0' + n : '' + n
  29. }
  30. /**
  31. * 格式化时间为 yyyy-MM-dd HH:mm:ss
  32. * @param {String|Date|Number} v ISO 串 / Date / 时间戳
  33. */
  34. export function formatDateTime(v) {
  35. var d = v instanceof Date ? v : (typeof v === 'number' ? new Date(v) : parseDate(v))
  36. if (!d) return ''
  37. return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) +
  38. ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds())
  39. }
  40. /**
  41. * 格式化时间为 yyyy-MM-dd(仅日期)
  42. */
  43. export function formatDate(v) {
  44. var d = v instanceof Date ? v : (typeof v === 'number' ? new Date(v) : parseDate(v))
  45. if (!d) return ''
  46. return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
  47. }
  48. /**
  49. * 分 → 元(保留两位小数)
  50. * @param {Number} fen 以「分」为单位的整数金额
  51. * @returns {String} 如 '199.00'
  52. */
  53. export function fenToYuan(fen) {
  54. if (fen === null || fen === undefined || fen === '') return '0.00'
  55. var n = Number(fen)
  56. if (isNaN(n)) return '0.00'
  57. return (n / 100).toFixed(2)
  58. }
  59. /**
  60. * 元 → 分(整数,供下单等场景)
  61. * @param {Number} yuan
  62. * @returns {Number}
  63. */
  64. export function yuanToFen(yuan) {
  65. var n = Number(yuan)
  66. if (isNaN(n)) return 0
  67. return Math.round(n * 100)
  68. }