论坛等发贴时间格式转换的正确姿势(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...

相关推荐
Cachel wood5 分钟前
Django REST framework (DRF)中的api_view和APIView权限控制
javascript·vue.js·后端·python·ui·django·前端框架
m0_7482340812 分钟前
Spring Boot教程之三十一:入门 Web
前端·spring boot·后端
Domain-zhuo21 分钟前
如何提高webpack的构建速度?
前端·webpack·前端框架·node.js·ecmascript
放逐者-保持本心,方可放逐35 分钟前
SSE 流式场景应用 及 方案总结
javascript·axios·fetch·eventsource
还是大剑师兰特36 分钟前
面试题:ES6模块与CommonJS模块有什么异同?
前端·es6·大剑师
胡西风_foxww1 小时前
【ES6复习笔记】数值扩展(16)
前端·笔记·es6·扩展·数值
mosen8681 小时前
uniapp中uni.scss如何引入页面内或生效
前端·uni-app·scss
白云~️1 小时前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
沙尘暴炒饭1 小时前
uniapp 前端解决精度丢失的问题 (后端返回分布式id)
前端·uni-app
政采云技术1 小时前
React前端权限管理思路
前端·react.js