Golang 和Python 几个小时前 几分钟 几天前的处理

该博客介绍了在Go和Python中如何处理非标准时间格式,如'10天前'、'10分钟前'和'刚刚'等。提供了一种将这些表达式转换为标准日期格式的方法,以便于数据爬取和处理。在Go中,通过遍历特定字符串并检查是否包含关键字来实现;在Python中,使用正则表达式和时间库进行转换。
摘要由CSDN通过智能技术生成

在用golang爬虫的时候
总会遇到 10天前 10分钟前 刚刚这种很影响我们爬取正常事件
所以我写了个方法 来格式化这种事件

golang 版本

package utils

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
	"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
	}

}

Python版本

# -*- coding: utf-8 -*-
# @Time    : 2022/8/19 11:31
# @Author  : lzc
# @Email   : hybpjx@163.com
# @File    : __init__.py.py
# @Software: PyCharm
import operator
from datetime import datetime, timedelta
import re


def number_turn_to(input_data):
    regex_list = [
        {"name": "一", 'value': 1},
        {"name": "二", 'value': 2},
        {"name": "三", 'value': 3},
        {"name": "四", 'value': 4},
        {"name": "五", 'value': 5},
        {"name": "六", 'value': 6},
        {"name": "七", 'value': 7},
        {"name": "八", 'value': 8},
        {"name": "九", 'value': 9},
        {"name": "十", 'value': 10},
    ]

    for i1 in regex_list:
        for i2 in i1['name']:
            input_data = re.sub(i2, str(i1['value']), input_data)
    return input_data


def hoursBefore_dayBefore_format(arc_time):
    arc_time = number_turn_to(arc_time.strip())

    time_list = [
        "小时前",
        "分钟前",
        "刚刚",
    ]
    now_time = datetime.strftime(datetime.today(), '%Y-%m-%d')
    for t in time_list:
        IsContains = operator.contains(arc_time, t)
        if IsContains:
            now_hour = datetime.strftime(datetime.today(), "%H")
            pattern = re.search(r"(\d+)", arc_time)

            if not pattern:
                if arc_time == "刚刚":
                    return now_time
                else:
                    return "请传入带有数字类型 小时前"
            arc_hour = pattern.group(1)

            if arc_hour <= now_hour:
                # 24小时之前,一律替换成当天日期
                return now_time
            elif "分钟前" in arc_time:
                return now_time
            else:
                arc_time = datetime.strftime(datetime.today() + timedelta(days=-1), '%Y-%m-%d')  # 获取前1天日期
                return arc_time
    if "天前" in arc_time:
        try:
            d = [str(d) + '天前' for d in range(1, 15)]
            arc_time = datetime.strftime(datetime.today() + timedelta(days=(d.index(arc_time) + 1) * -1),
                                         '%Y-%m-%d')
            return arc_time
        except Exception:
            return f"转换失败 当前时间{now_time},网站中的时间{arc_time}"

    else:
        return arc_time

if __name__ == '__main__':
    print(hoursBefore_dayBefore_format("一天前"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值