论坛等发贴时间格式转换的正确姿势(n秒/n天)等

前言

本篇文章基于今天早上,掘金给我推送了一篇文章(不清楚为啥突然给我推送这个),是关于时间转换的。看到这篇文章阅读量蛮大,留言挺多,很多小伙伴收藏了,因为很久很久之前,我们项目中也有类似的实现,简单看了一下这位小伙伴的实现,还是有一些问题。所以本篇文章纠正一下他的这些问题,帮助小伙伴在后面用到的时候能够使用准确的。而不是上线之后,会有很多问题反馈出来的那种。

指出问题

掘金小伙伴的实现大概存在如下几个问题

1、时间没有转成固定区时时间,假如某人在国外,服务器在国内,国外的区时和国内不一致,很可能导致观看时间比发布时间还早的情况,所以要转换为固定时区来计算时间,例如,统一转换为服务器用的区时,例如:北京时间

2、几天前的逻辑不太对,应该以0点为准,假如今天是14号,你时间输入12号,打印的时间是1天前,肯定不对,

3、 new Date(date).getTime(),有些ios手机这么写解析不对,可以真机测试一下。应该说是兼容性问题吧

正确写法

sql 复制代码
    // ios直接new Date(某个时间) 经常出现格式不对的情况,如下写法可以兼容
    function parseDateString(dateString) {
      const regex = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/
      const match = dateString.match(regex)
    
      if (match) {
        const year = parseInt(match[1])
        const month = parseInt(match[2]) - 1
        const day = parseInt(match[3])
        const hour = parseInt(match[4])
        const minute = parseInt(match[5])
        const second = parseInt(match[6])
        return new Date(year, month, day, hour, minute, second)
      }
      return new Date(dateString)
    }
    
   // 格式转换
    export const formatPublishTime = (createTime) => {
      if (!createTime) {
        return ''
      }
    // 统一转换为北京时间
      const currentTime = new Date(new Date().getTime() + (parseInt(new Date().getTimezoneOffset() / 60) + 8) * 3600 * 1000)
      const publishTime = parseDateString(createTime)
    
      const timeDiff = Math.floor((currentTime - publishTime) / 1000) // 计算时间差,单位为秒
     // 将时间转换为0点,0点为一天开始,符合人们平时的习惯
      const dayDiff = Math.floor((currentTime.setHours(0, 0, 0, 0) - publishTime.setHours(0, 0, 0, 0)) / 1000 / 60 / 60 / 24)
      if (dayDiff == 0) {
        if (timeDiff < 60) {
          return timeDiff + '秒前发布'
        } else if (timeDiff < 3600) {
          const minutes = Math.floor(timeDiff / 60)
          return minutes + '分钟前发布'
        } else {
          const hours = Math.floor(timeDiff / 3600)
          return hours + '小时前发布'
        }
      } else if (dayDiff == 1) {
        return '昨天发布'
      } else if (dayDiff == 2) {
        return '前天发布'
      } else {
        const year = publishTime.getFullYear()
        const month = ('0' + (publishTime.getMonth() + 1)).slice(-2)
        const day = ('0' + publishTime.getDate()).slice(-2)
        return year + '-' + month + '-' + day + '发布'
      }
    }

小结

上面写法应该没有大问题了,希望看到之前收藏的小伙伴可以看下这篇文章,也希望这个问题给你有所帮助。今年是haorooms博客文章10年,10年经历了很多,博客仅仅是个人问题的一些记录。不过有点奢侈,自己搞了一个服务器来做。但是后面是否通过转型来获取博客服务器的费用支持,还有待考虑,希望我的博客可以长久的写下去!

文章地址来源:www.haorooms.com/post/bbs_ti...

之前的小伙伴掘金文章:juejin.cn/post/731770...

相关推荐
_.Switch1 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光1 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   1 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   1 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常1 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr2 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho3 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常4 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js