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

相关推荐
修己xj几秒前
告别手动存图!这款叫 Fatkun 的浏览器插件,简直是素材收集神器
前端
袋鼠云数栈41 分钟前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
AskHarries1 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment1 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
qcx231 小时前
【系统学AI】25 论文导读 ①:两篇改变 AI 的开山之作——Attention Is All You Need & ReAct
前端·人工智能·react.js·transformer
kyriewen2 小时前
大文件上传最全指南:分片、断点续传、秒传,一篇就够了
前端·javascript·面试
我叫黑大帅3 小时前
解决聊天页内部滚轮改为页面滚动问题
javascript·后端·面试
郑洁文3 小时前
基于Python的Web命令执行漏洞自动化检测系统
前端·python·网络安全·自动化
新酱爱学习3 小时前
手搓 10 个 Skill 后,我把重复劳动收敛成了一套零依赖 CLI 工具
前端·javascript·人工智能
罗超驿3 小时前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript