相对时间变时间戳

相对时间变时间戳

import re
from datetime import datetime, timedelta

from loguru import logger

# 定义一个映射表,将汉字数字转换为对应的整数
CHINESE_NUMBERS = {
    '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
    '六': 6, '七': 7, '八': 8, '九': 9, '十': 10,
    '两': 2
}


def chinese_to_int(chinese_number: str) -> int:
    """
    将汉字数字转换成整数。
    只支持小于100的汉字数字。
    """
    if chinese_number.isdigit():  # 如果是纯数字直接返回
        return int(chinese_number)

    total = 0
    unit = 1
    num = 0
    for char in reversed(chinese_number):
        if char == '十':  # 如果是 "十" 字,处理十位
            unit = 10
            if num == 0:  # 如果 "十" 前面没有数字,表示是 "十" 而非 "X十"
                num = 1
            total += num * unit
            num = 0
        else:
            if char in CHINESE_NUMBERS:  # 如果是普通数字,直接加
                num = CHINESE_NUMBERS[char]
            total += num * unit
            num = 0
            unit = 1
    return total


def convert_relative_time_to_timestamp(relative_time: str) -> int:
    """
    将相对时间(如"2天前发布","一小时前发布")转换为时间戳。
    """
    # 获取当前时间
    now = datetime.now()

    # 处理并解析输入字符串
    if "天前" in relative_time:
        match = re.search(r'([\d一二三四五六七八九十两]+)天前', relative_time)
        if match:
            days = chinese_to_int(match.group(1))
            result_time = now - timedelta(days=days)
        else:
            raise ValueError("无法解析 '天前' 时间格式")

    elif "小时前" in relative_time:
        match = re.search(r'([\d一二三四五六七八九十两]+)小时前', relative_time)
        if match:
            hours = chinese_to_int(match.group(1))
            result_time = now - timedelta(hours=hours)
        else:
            raise ValueError("无法解析 '小时前' 时间格式")

    elif "分钟前" in relative_time:
        match = re.search(r'([\d一二三四五六七八九十两]+)分钟前', relative_time)
        if match:
            minutes = chinese_to_int(match.group(1))
            result_time = now - timedelta(minutes=minutes)
        else:
            raise ValueError("无法解析 '分钟前' 时间格式")

    else:
        raise ValueError("无法识别的时间格式: " + relative_time)

    # 返回时间戳
    return int(result_time.timestamp())


# 测试
def test_convert_relative_time_to_timestamp():
    test_key = ["2天前发布", "一小时前发布", "十五分钟前发布", "两天前发布"]
    for item in test_key:
        logger.info({item: convert_relative_time_to_timestamp(item)})


test_convert_relative_time_to_timestamp()

""" 输出结果
2025-04-27 14:57:48.874 | INFO     | __main__:test_convert_relative_time_to_timestamp:84 - {'2天前发布': 1745564268}
2025-04-27 14:57:48.874 | INFO     | __main__:test_convert_relative_time_to_timestamp:84 - {'一小时前发布': 1745733468}
2025-04-27 14:57:48.874 | INFO     | __main__:test_convert_relative_time_to_timestamp:84 - {'十五分钟前发布': 1745736168}
2025-04-27 14:57:48.874 | INFO     | __main__:test_convert_relative_time_to_timestamp:84 - {'两天前发布': 1745564268}
"""
### STM32 中获取相对时间戳的方法 在 STM32 的开发过程中,可以通过 RTC(实时时钟)模块或者 SysTick 定时器来实现相对时间戳的获取。以下是两种常见的方法及其代码示例。 #### 方法一:使用 RTC 模块获取相对时间戳 RTC 是一种硬件定时器,可以用来记录绝对时间或计算两个事件之间的时间差。以下是一个基于 RTC 的时间戳获取示例: ```c #include "stm32f1xx_hal.h" // 初始化 RTC void MX_RTC_Init(void) { // 配置 RTC 初始化参数... } // 获取当前时间戳 (秒级精度) uint32_t GetRtcTimestamp(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // 获取当前时间 HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // 获取当前日期 uint32_t timestamp; struct tm tmInfo; tmInfo.tm_year = sDate.Year + 100; // 年份相对于 1900 的偏移量 tmInfo.tm_mon = sDate.Month - 1; // 月份从 0 开始 tmInfo.tm_mday = sDate.Date; // 日 tmInfo.tm_hour = sTime.Hours; // 小时 tmInfo.tm_min = sTime.Minutes; // 分钟 tmInfo.tm_sec = sTime.Seconds; // 秒 time_t rawtime = mktime(&tmInfo); timestamp = (uint32_t)(rawtime); return timestamp; } ``` 此代码片段展示了如何通过 `HAL` 库初始化并读取 RTC 时间,将其转换为 Unix 时间戳形式。注意,在实际应用中可能需要调整时区偏差[^1]。 --- #### 方法二:使用 SysTick 计算相对时间戳 SysTick 是一个简单的向下计数定时器,通常用于提供微秒级别的延迟和周期性中断。它非常适合于测量短时间段内的相对时间戳。 ```c #include "stm32f1xx_hal.h" #include "core_cm3.h" // 包含 SysTick 头文件 volatile uint32_t tick_ms = 0; // SysTick 中断回调函数 void SysTick_Handler(void) { tick_ms++; } // 启动 SysTick 定时器 (每毫秒触发一次中断) void StartSysTickTimer(uint32_t ticks_per_second) { if (SysTick_Config(SystemCoreClock / ticks_per_second)) { while (1); // 如果配置失败,则进入死循环 } } // 获取当前的相对时间戳 (单位: 毫秒) uint32_t GetSysTickTimestamp(void) { return tick_ms; } ``` 在此示例中,`tick_ms` 量存储自启动以来经过的毫秒数。每次 SysTick 中断发生时,该量都会递增。因此,它可以作为相对时间戳使用[^2]。 --- ### 注意事项 - **RTC 方式**适用于长时间跨度的应用场景,例如日志记录、数据采集等。 - **SysTick 方式**更适合实时性强的任务调度或短暂间隔的测量。 - 在使用 RTC 或 SysTick 之前,请确保已正确初始化外设及相关资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值