当前位置:

首页 > 编程开发 > C++如何判断一个日期是否符合RFC 1123的HTTP标准格式

C++如何判断一个日期是否符合RFC 1123的HTTP标准格式

解析HTTP日期格式,尤其是严格按照RFC 1123规范的那种——比如“Sun, 06 Nov 1994 08:49:37 GMT”——看起来简单,实际上在C++里踩坑的人不在少数。最常见的误区就是直接上std::get_time,结果发现怎么也解析不了。这不是你代码写错了,而是底层strptime

解析HTTP日期格式,尤其是严格按照RFC 1123规范的那种——比如“Sun, 06 Nov 1994 08:49:37 GMT”——看起来简单,实际上在C++里踩坑的人不在少数。最常见的误区就是直接上std::get_time,结果发现怎么也解析不了。这不是你代码写错了,而是底层strptime对逗号的兼容性问题。

C++如何判断一个日期是否符合RFC 1123的HTTP标准格式

什么是RFC 1123日期格式,为什么不能直接用std::get_time?

RFC 1123格式要求非常严格:逗号必须紧跟星期缩写,后面有一个空格,时区字段必须是全大写的“GMT”,星期和月份缩写必须是固定的小写英文(例如sun、jan)。C++标准库的std::get_time在libstdc++和MSVC等常见实现中,一旦遇到逗号就直接罢工——它不支持%a之后紧跟逗号的格式,底层strptime根本过不了这一关。所以别自责,是工具本身的限制,不是你写错了格式字符串。

用std::regex做初步格式校验是否够用?

正则表达式用来快速筛掉明显不合法的字符串是OK的,但关键问题是它验证不了语义,比如2月30号、时区是不是真的GMT。推荐用下面这个模式做前置过滤:

^([A-Za-z]{3}), ([0-9]{2}) ([A-Za-z]{3}) ([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) GMT$

匹配之后一定要记得查表比对星期和月份缩写,因为[A-Za-z]{3}会放过像“Xxx”这种非法缩写,而RFC要求必须是全小写的标准缩写(sun/mon/jan/feb等)。正则只适合做快速淘汰,最终还是要靠后续的逻辑验证。

手动解析+查表验证才是可靠做法

最可靠的做法是彻底放弃std::get_time,自己动手按字符位置拆解字段,再逐一校验。步骤其实很清晰:

  • 检查第0–2位是否为合法的星期缩写(忽略大小写,但后续必须映射到标准集合集,像sun、mon等)
  • 检查第5–6位是否为01–31之间的数字(但需要结合月份判断具体上限)
  • 检查第8–10位是否为合法月份缩写(jan–dec)
  • 检查第12–15位是否为合理的年份,一般限制在1970–2038(POSIX时间范围内)
  • 检查时间部分是否符合24小时制(00–23),秒数≤59
  • 强制要求时区字段精确等于“GMT”(全大写,两端无空格)

其中比较隐蔽的是月份天数的动态判断——比如2月需要区分闰年。可以用std::chrono::year_month_day辅助验证,不过得先把提取出来的数字构造为year{y}/month{m}/day{d},然后调用ok()成员函数。这套流程写起来不复杂,但比直接调库多了一份可控性。

有没有现成可用的轻量级方案?

如果你项目里已经有Boost,那直接用boost::date_time的parse_date_time配合rfc_1123格式器就能正确解析,但为了一个日期解析引入Boost可能显得有些重。更务实的做法是复用curl或Poco里现成的RFC 1123解析函数,它们都是手工实现的查表+校验,经过大量生产验证。甚至可以直接抄一段老C代码(比如http_date_parse类函数),比自己从零写省心多了。

真正容易被忽略的细节是:GMT必须全大写、逗号后面必须有且仅有一个空格、月份和星期缩写必须小写——这些条件缺一不可,稍微偏差一点,就不算合法的RFC 1123日期。记住这些硬约束,才能写出真正健壮的解析逻辑。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
美初创公司获FCC批准发射轨道反光卫星,意图“按需”照亮地球
美初创公司获FCC批准发射轨道反光卫星,意图“按需”照亮地球

美国反射轨道公司获准发射首颗轨道反光卫星埃兰迪尔,计划利用薄膜反射镜将阳光反射至地球特定区域以延长当地白昼时间。但专家担忧此举可能严重干扰天文观测并影响生物昼夜节律。

三星Fit4手环设计曝光 蓝牙升级至5.4 已通过FCC认证
三星Fit4手环设计曝光 蓝牙升级至5.4 已通过FCC认证

三星Fit4手环已通过FCC认证,外观与Fit3一致,蓝牙升级至5.4并支持低功耗,但未配备WiFi、NFC、GPS、UWB及LTE。延续前代高性价比运动手环定位,主打心率监测、睡眠追踪与触控屏。上市时间未定,预计认证后几周至几个月内发布。

华硕MB14FCD 14英寸360°可折叠双屏便携显示器开售,1999元
华硕MB14FCD 14英寸360°可折叠双屏便携显示器开售,1999元

华硕ZenScreenDuoMB14FCD双屏便携式显示器正式开售,售价仅1999元。两块14英寸IPS液晶屏幕,1920×1200高分辨率,100%sRGB广色域覆盖,360°旋转转轴设计支持多模式。提供USB-C与mini-HDMI双接口,可一线连笔记本供电与视频信号传输,配套软件可智能切换横竖屏。

三星A08 4G现身FCC:6000mAh大电池+15W充电
三星A08 4G现身FCC:6000mAh大电池+15W充电

三星GalaxyA084G手机近日通过FCC认证,型号SM-A085M,支持4G网络、双频无线网络以及FM调频广播功能。内置5830毫安时电池(标称6000毫安时),支持15瓦充电,后置摄像头竖向排列。衍生版本M08和F08也已通过认证,共享核心配置,预计未来一至两个月内正式上市。

MFC预编译头文件stdafx.h及stdafx.cpp的使用小结
MFC预编译头文件stdafx.h及stdafx.cpp的使用小结

MFC项目中,stdafx.h和stdafx.cpp实现预编译头文件技术,将稳定的核心头文件与扩展类提前编译为.pch,避免重复编译,大幅提升大型项目的编译速度,并简化代码维护与依赖管理。

为什么苹果至今也不开放 NFC 功能?
为什么苹果至今也不开放 NFC 功能?

苹果自2014年iPhone6起内置NFC硬件,但长期仅限ApplePay使用,直到iOS13才开放写入功能。开放进程缓慢,背后主因是保护ApplePay市场份额,安全隐私只是商业挡箭牌。目前正逐步平衡开放与安全,具体功能开放时间未知。

FCL启动器如何备份游戏数据防止丢失
FCL启动器如何备份游戏数据防止丢失

FCL启动器提供游戏数据备份功能。启用自动备份需在设置中勾选并配置间隔与保留份数;手动备份可通过头像图标或存档管理页面操作。备份文件位于数据目录的backup子文件夹,恢复时需将备份内容覆盖至对应存档文件夹。

FCL启动器怎么设置全屏玩游戏不显示虚拟键
FCL启动器怎么设置全屏玩游戏不显示虚拟键

关闭FCL启动器虚拟按键全局显示,设置中禁用“启用虚拟按键”。游戏启动选全屏模式,添加参数禁用触控覆盖(-Dfcl.disable.touch.overlay=true)。游戏内关闭HUD,长按屏幕确认无虚拟按键弹出,从而彻底隐藏避免误触。

FCL启动器怎么删除不想要的游戏版本
FCL启动器怎么删除不想要的游戏版本

先说结论:在FCL启动器里清理那些不用的旧游戏版本,其实很简单。打开「版本管理」,长按或者点一下垃圾桶图标,选卸载,确认之后它就会自动把文件清干净,连列表里的条目都一并消失。 为什么要费这个功夫?想想看,手机存储空间本来就金贵,一堆下错的、试玩的、或者早就没碰过的旧版本堆在那里,不仅占地方,每次选版

FCL启动器怎么导出游戏截图到手机相册
FCL启动器怎么导出游戏截图到手机相册

很多人在FCL启动器上玩《崩坏:星穹铁道》或者跑Minecraft整合包时,都会遇到一个尴尬:游戏画面明明已经渲染在手机屏幕上,想截个图却找不到内置按钮。其实这事儿没那么复杂——画面既然能显示,就一定有办法把它存进相册。下面直接上干货,三种方案按优先级排好,根据自己的设备情况选就行。 用系统级截图功

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
3ds max(3dmax)
3ds max(3dmax)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

PixTV 网页版
PixTV 网页版
Windows

PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。