可以用位分段做到年月日时分秒存放,最多4096年,还不如直接 uint32 存时间戳,最大时间 2106 年 2 月 7 日 06:28:15
[C] 纯文本查看 复制代码 // 定义时间分量的位偏移和掩码(总位数:40位)
CONSTANT BASE_YEAR = 2000 // 基准年份,用于年份偏移计算
// 位偏移量(从最低位开始计算)
CONSTANT SECOND_SHIFT = 0 // 秒:0-5位(6位)
CONSTANT MINUTE_SHIFT = 6 // 分:6-11位(6位)
CONSTANT HOUR_SHIFT = 12 // 时:12-16位(5位)
CONSTANT DAY_SHIFT = 17 // 日:17-21位(5位)
CONSTANT MONTH_SHIFT = 22 // 月:22-25位(4位)
CONSTANT YEAR_SHIFT = 26 // 年:26-37位(12位)
// 掩码(用于提取对应位)
CONSTANT SECOND_MASK = 0x3F // 二进制:111111
CONSTANT MINUTE_MASK = 0x3F // 二进制:111111
CONSTANT HOUR_MASK = 0x1F // 二进制:11111
CONSTANT DAY_MASK = 0x1F // 二进制:11111
CONSTANT MONTH_MASK = 0xF // 二进制:1111
CONSTANT YEAR_MASK = 0xFFF // 二进制:111111111111
/**
* 将年月日时分秒转换为40位整数
* @param year 年份(如2023)
* @param month 月份(1-12)
* @param day 日期(1-31)
* @param hour 小时(0-23)
* @param minute 分钟(0-59)
* @param second 秒(0-59)
* @Return 40位整数(存储了完整时间信息)
*/
FUNCTION encodeDateTime(year, month, day, hour, minute, second) -> 40bitInt:
// 验证输入合法性(简化版)
IF year < BASE_YEAR OR month < 1 OR month > 12 OR day < 1 OR day > 31
OR hour < 0 OR hour > 23 OR minute < 0 OR minute > 59 OR second < 0 OR second > 59:
THROW "Invalid date/time"
// 计算偏移量(转为从0开始的数值)
yearOffset = year - BASE_YEAR // 年份相对于基准年的偏移
monthOffset = month - 1 // 月份转为0-11
dayOffset = day - 1 // 日期转为0-30
// 位运算拼接:左移到对应位置后用或运算合并
encoded = (yearOffset << YEAR_SHIFT)
| (monthOffset << MONTH_SHIFT)
| (dayOffset << DAY_SHIFT)
| (hour << HOUR_SHIFT)
| (minute << MINUTE_SHIFT)
| (second << SECOND_SHIFT)
RETURN encoded
/**
* 从40位整数中解析出年月日时分秒
* @param encodedTime 用encodeDateTime生成的40位整数
* @return 包含year, month, day, hour, minute, second的结构体
*/
FUNCTION decodeDateTime(encodedTime) -> DateTime:
// 用掩码提取对应位,并右移到最低位
second = (encodedTime >> SECOND_SHIFT) & SECOND_MASK
minute = (encodedTime >> MINUTE_SHIFT) & MINUTE_MASK
hour = (encodedTime >> HOUR_SHIFT) & HOUR_MASK
dayOffset = (encodedTime >> DAY_SHIFT) & DAY_MASK
monthOffset = (encodedTime >> MONTH_SHIFT) & MONTH_MASK
yearOffset = (encodedTime >> YEAR_SHIFT) & YEAR_MASK
// 转换回实际值(偏移量+基准)
year = BASE_YEAR + yearOffset
month = monthOffset + 1
day = dayOffset + 1
// 返回解析后的时间结构体
RETURN {
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second
}
// 使用示例
// 编码:2023年10月5日14时30分25秒
encoded = encodeDateTime(2023, 10, 5, 14, 30, 25)
PRINT "Encoded value: ", encoded // 输出40位整数
// 解码
decoded = decodeDateTime(encoded)
PRINT "Decoded: ", decoded.year, "-", decoded.month, "-", decoded.day, " ",
decoded.hour, ":", decoded.minute, ":", decoded.second // 应输出原时间 |