You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将WhatsApp聊天日志的12小时制时间转换为24小时制

WhatsApp聊天日志12小时制转24小时制解决方案

问题背景

我有大量空格分隔的WhatsApp聊天日志,其中95%的日志行遵循格式 MM/DD/YY, HH:MM XM - participant: chatText,需要将其中的12小时制时间戳转换为24小时制,同时保留非标准格式的行不修改。要求支持读取日志文件、原地修改或输出到新文件,且尽量无需额外安装开发环境。

原日志示例

5/30/22, 9:50 AM - person2: Good morning
5/30/22, 11:35 AM - person1: Hi, how are you?
5/30/22, 11:47 AM - person2: I am well
Transfer number: 3778324
Completed:
5/30/22, 12:55 PM - person1: https://mylink.com
5/30/22, 12:59 PM - person2: <Media omitted>
5/30/22, 9:46 PM - person1: thanks

期望转换结果

5/30/22, 09:50 - person2: Good morning
5/30/22, 11:35 - person1: Hi, how are you?
5/30/22, 11:47 - person2: I am well
Transfer number: 3778324
Completed:
5/30/22, 12:55 - person1: https://mylink.com
5/30/22, 12:59 - person2: <Media omitted>
5/30/22, 21:46 - person1: thanks

之前尝试的awk命令无法完整转换小时,也不会跳过非标准行,以下是修正后的方案:


修正后的awk命令

核心逻辑是先精准匹配标准格式的日志行,再对时间字段做转换,非匹配行直接输出。

awk '
BEGIN { OFS = " " }
# 匹配标准格式行:开头为日期,接着是HH:MM AM/PM,然后是"-"
/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2}, [0-9]{1,2}:[0-9]{2} (AM|PM) -/ {
    # 拼接时间字符串,调用date命令转换为24小时制
    cmd = "date --date=\"" $2 " " $3 "\" +%H:%M"
    cmd | getline new_time
    close(cmd)  # 关闭管道避免资源泄漏
    # 替换原时间字段,移除AM/PM字段
    $2 = new_time
    $3 = ""
    # 输出处理后的行
    print $0
    next
}
# 非标准格式行直接输出
{ print }
' input.txt > output.txt

关键改进说明

  • 精准匹配标准行:用正则表达式锁定符合格式的日志,避免误修改其他行。
  • 正确时间转换:通过date命令自动处理12小时转24小时的逻辑,比如9:46 PM转为21:46,9:50 AM转为09:50。
  • 清理冗余字段:转换后移除原有的AM/PM字段,避免输出多余空格。
  • 避免资源泄漏:每次调用getline后关闭管道,防止awk打开过多文件描述符。

原地修改文件

如果需要直接修改原文件,有两种方式:

  1. 使用sponge(多数Linux发行版默认包含在moreutils包中):
awk '...' input.txt | sponge input.txt
  1. 无sponge时,用临时文件中转:
awk '...' input.txt > temp.txt && mv temp.txt input.txt

验证效果

运行命令后,标准格式行的时间会正确转换,非标准行(如Transfer number: 3778324)保持原样,完全符合预期结果。

内容的提问来源于stack exchange,提问作者dotarpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:52:51