[关闭]
@EncyKe 2016-10-26T02:49:05.000000Z 字数 9317 阅读 988

手记:时间处理相关函数

#手记



1. 功能函数

本文提供一批常用的时间处理功能函数,主要是后端时间戳与可视化时间的互换、相对时间模式的翻译等等。

1.1. 时间串 => 时间戳

  1. /**
  2. * @decription 将时间字符串转化为时间戳
  3. * @param {String} [date] - 时间字符串,缺省为当前时间
  4. * @param {Number} [digit]=10 - 输出时间戳的位数
  5. * @return {Number} returnTimeStamp - 时间戳
  6. *
  7. * @author Ency Ke
  8. * @since 2016-09-20
  9. * @example
  10. * dateToTimeStamp();
  11. * // ==> 当前 10 位时间戳;
  12. * dateToTimeStamp('', 13);
  13. * // ==> 当前 13 位时间戳;
  14. * dateToTimeStamp('2016年09月20日14:04:32');
  15. * dateToTimeStamp('2016-09-20 14:04:34');
  16. * dateToTimeStamp('2016年09月20日14:04:32', 13);
  17. * dateToTimeStamp('2016-09-20 14:04:34', 13);
  18. */
  19. function dateToTimeStamp(date, digit){
  20. var returnTimeStamp;
  21. if (typeof date === 'undefined' || date === '') {
  22. date = new Date();
  23. } else if (!!date.match(/[\u4e00-\u9fa5]/g)) {
  24. date = date.replace('年', '-').replace('月', '-').replace('日', ' ');
  25. } else {
  26. date = date;
  27. };
  28. if (digit === 13) {
  29. returnTimeStamp = Date.parse(date);
  30. } else if (typeof digit === 'undefined' || digit === 10) {
  31. returnTimeStamp = Math.round(Date.parse(date) / 1000);
  32. };
  33. return returnTimeStamp;
  34. }

1.2. 时间戳(时间串) => 相对时间模式(源码版)

  1. /**
  2. * @description 将时间戳或者时间字符串转换为相对时间模式
  3. * @param {(Number|String)} timeStamp - 时间戳或者时间字符串
  4. * @return {String} returnRelativeTime - 相对时间模式
  5. */
  6. function relativeTime(timeStamp){
  7. if (typeof timeStamp === 'number') {
  8. var date = new Date(timeStamp * 1000);
  9. } else if (typeof timeStamp === 'string') {
  10. var arr = timeStamp.split(/[- :]/);
  11. var date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
  12. };
  13. timeStamp = date.getTime();
  14. var returnRelativeTime;
  15. var currentStamp = new Date().getTime();
  16. var distanceMillis = currentStamp - timeStamp;
  17. var seconds = Math.floor(Math.abs(distanceMillis) / 1000);
  18. var minutes = Math.floor(seconds / 60);
  19. var hours = Math.floor(seconds / 3600);
  20. var days = Math.floor(seconds / 86400);
  21. // 1 天 (60 * 60 * 24 秒) 之前
  22. if (seconds >= 86400) {
  23. if (days == 1) {
  24. returnRelativeTime = '昨天 ' + formatTime(date, 'short');
  25. } else if (days == 2) {
  26. returnRelativeTime = '前天 ' + formatTime(date, 'short');
  27. } else {
  28. returnRelativeTime = formatTime(date, 'withNoYear');
  29. }
  30. // 1 小时 (60 * 60 秒) 之前
  31. } else if (seconds >= 3600) {
  32. returnRelativeTime = '今天 ' + formatTime(date, 'short');
  33. // 1 分钟 (60 秒) 之前
  34. } else if (seconds >= 60) {
  35. returnRelativeTime = minutes + ' 分钟前';
  36. // 1 分钟之内
  37. } else {
  38. returnRelativeTime = '刚刚';
  39. };
  40. return returnRelativeTime;
  41. }
  42. /**
  43. * @description 将 Date 对象按选项输出位时间字符串
  44. * @param {Object} date - Date 对象
  45. * @param {String} [type]='full' - 输出选项:'short' | 'withNoYear' | 'full'
  46. * @return {String} dateString - 时间字符串
  47. */
  48. function formatTime(date, type) {
  49. var currentYear = new Date().getFullYear();
  50. var year = date.getFullYear();
  51. var month = date.getMonth() + 1;
  52. var day = date.getDate();
  53. var hour = date.getHours();
  54. var min = date.getMinutes() + '';
  55. var dateString;
  56. if (hour < 10) hour = '0' + hour;
  57. if (min.length == 1) min = '0' + min;
  58. switch (type) {
  59. case 'short':
  60. dateString = hour + ':' + min;
  61. break;
  62. case 'withNoYear':
  63. dateString = month + '-' + day + ' ' + hour + ':' + min;
  64. if (year != currentYear) {
  65. dateString = year + '-' + dateString;
  66. };
  67. break;
  68. default:
  69. case 'full':
  70. dateString = year + '-' + month + '-' + day + ' ' + hour + ':' + min;
  71. break;
  72. }
  73. return dateString;
  74. }

1.3. 时间戳 => 多种时间模式(优化版:相对时间模式、标准模式)

  1. /**
  2. * @description 不够两位数的数字前面加0
  3. * @param {Number} n - 可能需要补零的数字
  4. * @returns {String} n - 已补零的字符串
  5. */
  6. function add0(n){
  7. return n < 10 ? '0' + n : '' + n;
  8. }
  9. /**
  10. * @description 输出 Date 对象的各个属性
  11. * @param {Object} time - Date 对象
  12. * @return {Object} returnTimeInfo - 包含各个时间属性的对象
  13. */
  14. function getTimeInfo(time) {
  15. /**
  16. * @type {Object}
  17. * @property stamp - 13 位时间戳
  18. * @property year - 年份 YYYY
  19. * @property month - 月份 MM
  20. * @property day - 日期 DD
  21. * @property hour - 小时 hh
  22. * @property minute - 分钟 mm
  23. */
  24. var returnTimeInfo = {
  25. stamp: time.getTime(),
  26. year: time.getFullYear(),
  27. month: add0(time.getMonth() + 1),
  28. day: add0(time.getDate()),
  29. hour: add0(time.getHours()),
  30. minute: add0(time.getMinutes()),
  31. };
  32. return returnTimeInfo;
  33. }
  34. /**
  35. * @description 将 Date 对象按选项输出位时间字符串
  36. * @param {Object} time - Date 对象
  37. * @param {String} [type]='full' - 输出选项:'short' | 'withNoYear' | 'full'
  38. * @return {String} returnDateString - 时间字符串
  39. */
  40. function timeToDate(time, type) {
  41. // 验证输入值
  42. if (typeof time !== 'object') {
  43. return;
  44. };
  45. var returnDateString;
  46. var currentTime = getTimeInfo(new Date());
  47. var targetTime = getTimeInfo(time);
  48. switch (type) {
  49. case 'short':
  50. returnDateString = targetTime.hour + ':' + targetTime.minute;
  51. break;
  52. case 'withNoYear':
  53. returnDateString = targetTime.month + '-' + targetTime.day + ' ' + targetTime.hour + ':' + targetTime.minute;
  54. if (targetTime.year !== currentTime.year) {
  55. returnDateString = targetTime.year + '-' + returnDateString;
  56. };
  57. break;
  58. default:
  59. case 'full':
  60. returnDateString = targetTime.year + '-' + targetTime.month + '-' + targetTime.day + ' ' + targetTime.hour + ':' + targetTime.minute;
  61. break;
  62. }
  63. return returnDateString;
  64. }
  65. /**
  66. * @description 将时间戳或者时间字符串转换为相对时间模式
  67. * @param {(Number|String)} timeStamp - 时间戳或者时间字符串
  68. * @param {Boolean} [isRelative]=false - 是否输出相对时间模式
  69. * @return {String} returnRelativeTime - 相对时间模式
  70. */
  71. function timeStampToDate(timeStamp, isRelative) {
  72. // 验证输入值
  73. if (typeof timeStamp === 'number') {
  74. var time = new Date(timeStamp * 1000);
  75. } else if (typeof timeStamp === 'string') {
  76. var arr = timeStamp.split(/[- :]/);
  77. var time = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
  78. };
  79. var returnRelativeTime;
  80. var currentTime = getTimeInfo(new Date());
  81. var targetTime = getTimeInfo(time);
  82. var distance = {};
  83. distance.millis = currentTime.stamp - targetTime.stamp,
  84. distance.seconds = Math.floor(Math.abs(distance.millis) / 1000);
  85. distance.minutes = Math.floor(distance.seconds / 60);
  86. distance.hours = Math.round(distance.seconds / 3600);
  87. distance.days = Math.round(distance.seconds / 86400);
  88. // 1 天 (60 * 60 * 24 秒) 之前
  89. if (distance.seconds >= 86400) {
  90. if (distance.days === 1) {
  91. returnRelativeTime = '昨天 ' + timeToDate(time, 'short');
  92. } else if (distance.days === 2) {
  93. returnRelativeTime = '前天 ' + timeToDate(time, 'short');
  94. } else {
  95. returnRelativeTime = timeToDate(time, 'withNoYear');
  96. }
  97. // 1 小时 (60 * 60 秒) 之前
  98. } else if (distance.seconds >= 3600) {
  99. returnRelativeTime = distance.hours + ' 小时前';
  100. // 1 分钟 (60 秒) 之前
  101. } else if (distance.seconds >= 60) {
  102. returnRelativeTime = distance.minutes + ' 分钟前';
  103. // 1 分钟之内
  104. } else {
  105. returnRelativeTime = '刚刚';
  106. };
  107. if (isRelative === true) {
  108. return returnRelativeTime;
  109. } else {
  110. return returnRelativeTime = timeToDate(time, 'full');
  111. };
  112. }

2. 源码(封装版)

  1. /**
  2. * @class
  3. * @classdesc - 主要包含 dateToTimeStamp 和 timeStampToDate 两个转换方法
  4. */
  5. function HandleTime() {}
  6. HandleTime.prototype = {
  7. /**
  8. * @decription 将时间字符串转化为时间戳
  9. * @param {String} [date] - 时间字符串,缺省为当前时间
  10. * @param {Number} [digit]=10 - 输出时间戳的位数
  11. * @return {Number} returnTimeStamp - 时间戳
  12. *
  13. * @author Ency Ke
  14. * @since 2016-09-20
  15. * @example
  16. * dateToTimeStamp();
  17. * // ==> 当前 10 位时间戳;
  18. * dateToTimeStamp('', 13);
  19. * // ==> 当前 13 位时间戳;
  20. * dateToTimeStamp('2016年09月20日14:04:32');
  21. * dateToTimeStamp('2016-09-20 14:04:34');
  22. * dateToTimeStamp('2016年09月20日14:04:32', 13);
  23. * dateToTimeStamp('2016-09-20 14:04:34', 13);
  24. */
  25. dateToTimeStamp: function (date, digit){
  26. var returnTimeStamp;
  27. if (typeof date === 'undefined' || date === '') {
  28. date = new Date();
  29. } else if (!!date.match(/[\u4e00-\u9fa5]/g)) {
  30. date = date.replace('年', '-').replace('月', '-').replace('日', ' ');
  31. } else {
  32. date = date;
  33. };
  34. if (digit === 13) {
  35. returnTimeStamp = Date.parse(date);
  36. } else if (typeof digit === 'undefined' || digit === 10) {
  37. returnTimeStamp = Math.round(Date.parse(date) / 1000);
  38. };
  39. return returnTimeStamp;
  40. },
  41. /**
  42. * @description 不够两位数的数字前面加0
  43. * @param {Number} n - 可能需要补零的数字
  44. * @returns {String} n - 已补零的字符串
  45. */
  46. add0: function (n){
  47. return n < 10 ? '0' + n : '' + n;
  48. },
  49. /**
  50. * @description 输出 Date 对象的各个属性
  51. * @param {Object} time - Date 对象
  52. * @return {Object} returnTimeInfo - 包含各个时间属性的对象
  53. */
  54. getTimeInfo: function (time) {
  55. var self = this;
  56. /**
  57. * @type {Object}
  58. * @property stamp - 13 位时间戳
  59. * @property year - 年份 YYYY
  60. * @property month - 月份 MM
  61. * @property day - 日期 DD
  62. * @property hour - 小时 hh
  63. * @property minute - 分钟 mm
  64. */
  65. var returnTimeInfo = {
  66. stamp: time.getTime(),
  67. year: time.getFullYear(),
  68. month: self.add0(time.getMonth() + 1),
  69. day: self.add0(time.getDate()),
  70. hour: self.add0(time.getHours()),
  71. minute: self.add0(time.getMinutes()),
  72. };
  73. return returnTimeInfo;
  74. },
  75. /**
  76. * @description 将 Date 对象按选项输出位时间字符串
  77. * @param {Object} time - Date 对象
  78. * @param {String} [type]='full' - 输出选项:'short' | 'withNoYear' | 'full'
  79. * @return {String} returnDateString - 时间字符串
  80. */
  81. timeToDate: function (time, type) {
  82. var self = this;
  83. // 验证输入值
  84. if (typeof time !== 'object') {
  85. return;
  86. };
  87. var returnDateString;
  88. var currentTime = self.getTimeInfo(new Date());
  89. var targetTime = self.getTimeInfo(time);
  90. switch (type) {
  91. case 'short':
  92. returnDateString = targetTime.hour + ':' + targetTime.minute;
  93. break;
  94. case 'withNoYear':
  95. returnDateString = targetTime.month + '-' + targetTime.day + ' ' + targetTime.hour + ':' + targetTime.minute;
  96. if (targetTime.year !== currentTime.year) {
  97. returnDateString = targetTime.year + '-' + returnDateString;
  98. };
  99. break;
  100. default:
  101. case 'full':
  102. returnDateString = targetTime.year + '-' + targetTime.month + '-' + targetTime.day + ' ' + targetTime.hour + ':' + targetTime.minute;
  103. break;
  104. }
  105. return returnDateString;
  106. },
  107. /**
  108. * @description 将时间戳或者时间字符串转换为相对时间模式
  109. * @param {(Number|String)} timeStamp - 时间戳或者时间字符串
  110. * @param {Boolean} [isRelative]=false - 是否输出相对时间模式
  111. * @return {String} returnRelativeTime - 相对时间模式
  112. */
  113. timeStampToDate: function (timeStamp, isRelative) {
  114. var self = this;
  115. // 验证输入值
  116. if (typeof timeStamp === 'number') {
  117. var time = new Date(timeStamp * 1000);
  118. } else if (typeof timeStamp === 'string') {
  119. var arr = timeStamp.split(/[- :]/);
  120. var time = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
  121. };
  122. var returnRelativeTime;
  123. var currentTime = self.getTimeInfo(new Date());
  124. var targetTime = self.getTimeInfo(time);
  125. var distance = {};
  126. distance.millis = currentTime.stamp - targetTime.stamp,
  127. distance.seconds = Math.floor(Math.abs(distance.millis) / 1000);
  128. distance.minutes = Math.floor(distance.seconds / 60);
  129. distance.hours = Math.round(distance.seconds / 3600);
  130. distance.days = Math.round(distance.seconds / 86400);
  131. // 1 天 (60 * 60 * 24 秒) 之前
  132. if (distance.seconds >= 86400) {
  133. if (distance.days === 1) {
  134. returnRelativeTime = '昨天 ' + self.timeToDate(time, 'short');
  135. } else if (distance.days === 2) {
  136. returnRelativeTime = '前天 ' + self.timeToDate(time, 'short');
  137. } else {
  138. returnRelativeTime = self.timeToDate(time, 'withNoYear');
  139. }
  140. // 1 小时 (60 * 60 秒) 之前
  141. } else if (distance.seconds >= 3600) {
  142. returnRelativeTime = distance.hours + ' 小时前';
  143. // 1 分钟 (60 秒) 之前
  144. } else if (distance.seconds >= 60) {
  145. returnRelativeTime = distance.minutes + ' 分钟前';
  146. // 1 分钟之内
  147. } else {
  148. returnRelativeTime = '刚刚';
  149. };
  150. if (isRelative === true) {
  151. return returnRelativeTime;
  152. } else {
  153. return returnRelativeTime = self.timeToDate(time, 'full');
  154. };
  155. },
  156. };
  157. var handleTime = new HandleTime();

附:参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注