hybpjx 发表于 2023-3-30 10:17

Golang 对 刚刚 几个小时前 几分钟前 几天前的时间处理

在做Go爬虫的时候 爬取新闻的时候遇到了这个时间问题
特此做个记录

- 对刚刚 和 几分钟前的时间处理 默认返回当前时间
- 对几小时前返回几个小时 如果几个小时大于当前小时,那就返回上一天时间。
- 对于几天前 就是倒退几天前

```go
/*
@Time : 2023/3/30 10:10
@AuThor : zic
@file : time_test
@Software: GoLand
@blog : https://www.cnblogs.com/zichliang
*/
package test

import (
        "fmt"
        "regexp"
        "strconv"
        "strings"
        "testing"
        "time"
)

func HoursBeforeDayBeforeFormat(arcTime string) string {
        arcTime = strings.TrimSpace(arcTime)

        timeList := [...]string{
                "小时前",
                "分钟前",
                "刚刚",
        }

        t := time.Now()                              // 获取当前时间
        currentTime := t.Format("2006-01-02 15:04:05") //获取当前格式的日期
        for _, _value := range timeList {
                isContains := strings.Contains(arcTime, _value)
                if isContains {
                        nowHour := time.Now().Format("15")
                        pattern := regexp.MustCompile(`\d+`)
                        afterNumber := pattern.FindString(arcTime)
                        if afterNumber == "" {
                                if arcTime == "刚刚" {
                                        return currentTime
                                } else {
                                        return "请传入带有数字类型 比如:5小时前"
                                }
                        }

                        if afterNumber <= nowHour {
                                return currentTime
                        } else if strings.Contains(arcTime, "分钟前") {
                                return currentTime
                        } else {
                                beforeDay := t.AddDate(0, 0, -1)
                                return beforeDay.Format("2006-01-02 15:04:05")
                        }
                }
        }

        if strings.Contains(arcTime, "天前") {
                pattern := regexp.MustCompile(`\d+`)
                afterNumber, err := strconv.Atoi(fmt.Sprint("-", pattern.FindString(arcTime)))
                if err != nil {
                        return fmt.Sprintln(arcTime, "正则提取错误")
                }

                return fmt.Sprintln(t.AddDate(0, 0, afterNumber).Format("2006-01-02 15:04:05"))
        } else {
                return arcTime
        }

}

func TestTime(T *testing.T) {
        formatTime := HoursBeforeDayBeforeFormat("1分钟前")
        fmt.Println(formatTime)
}

```

侃遍天下无二人 发表于 2023-3-30 10:56

你可以再找找看,这种字符串一般都是在前端基于时间戳格式化而来的,找到时间戳处理起来就没这么麻烦了

hybpjx 发表于 2023-3-30 10:58

侃遍天下无二人 发表于 2023-3-30 10:56
你可以再找找看,这种字符串一般都是在前端基于时间戳格式化而来的,找到时间戳处理起来就没这么麻烦了

很多大部分就是静态数据 这样的也很方便。如果是ajax请求基本就是时间戳

侃遍天下无二人 发表于 2023-3-30 11:00

hybpjx 发表于 2023-3-30 10:58
很多大部分就是静态数据 这样的也很方便。如果是ajax请求基本就是时间戳

如果是静态的可以看看响应头里面的last modified字段,说不定可以直接拿来用

hybpjx 发表于 2023-3-30 11:07

侃遍天下无二人 发表于 2023-3-30 11:00
如果是静态的可以看看响应头里面的last modified字段,说不定可以直接拿来用

这个还真没注意 谢谢大佬,我这也是做个记录
页: [1]
查看完整版本: Golang 对 刚刚 几个小时前 几分钟前 几天前的时间处理