如何在VB.NET中解析iText7获取的PDF ISO日期字符串?
在VB.NET中解析PDF ISO日期字符串
PDF的日期格式以D:开头,后续为YYYYMMDDHHmmSS±HH'mm'(或Z表示UTC时区),例如你提供的D:20220817113241+00'00'。以下是两种可行的解析方案:
方法一:字符串替换后直接解析
通过简单的字符串清理,将PDF日期格式转换为.NET可识别的格式,再用DateTimeOffset.ParseExact解析:
' 原始PDF日期字符串 Dim pdfDateStr As String = "D:20220817113241+00'00'" ' 1. 移除开头的"D:"前缀 Dim cleanedStr As String = pdfDateStr.Substring(2) ' 2. 将时区部分的单引号替换为冒号,适配.NET的时区格式 cleanedStr = cleanedStr.Replace("'", ":") ' 3. 定义匹配的格式字符串 Dim dateFormat As String = "yyyyMMddHHmmsszzz" ' 4. 解析为DateTimeOffset(包含时区信息) Dim dateOffset As DateTimeOffset = DateTimeOffset.ParseExact(cleanedStr, dateFormat, Globalization.CultureInfo.InvariantCulture) ' 可按需转换为本地时间或UTC时间 Dim localDateTime As DateTime = dateOffset.LocalDateTime Dim utcDateTime As DateTime = dateOffset.UtcDateTime
方法二:正则表达式提取字段构造日期
如果需要更灵活的处理(比如兼容部分格式不完整的PDF日期),可以用正则表达式提取各个时间字段,手动构造DateTimeOffset:
Imports System.Text.RegularExpressions Dim pdfDateStr As String = "D:20220817113241+00'00'" ' 匹配PDF日期格式的正则表达式 Dim dateRegex As New Regex("D:(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})([+-])(\d{2})'(\d{2})'") Dim matchResult As Match = dateRegex.Match(pdfDateStr) If matchResult.Success Then ' 提取各个时间分量 Dim year = Integer.Parse(matchResult.Groups(1).Value) Dim month = Integer.Parse(matchResult.Groups(2).Value) Dim day = Integer.Parse(matchResult.Groups(3).Value) Dim hour = Integer.Parse(matchResult.Groups(4).Value) Dim minute = Integer.Parse(matchResult.Groups(5).Value) Dim second = Integer.Parse(matchResult.Groups(6).Value) Dim sign = matchResult.Groups(7).Value Dim offsetHour = Integer.Parse(matchResult.Groups(8).Value) Dim offsetMinute = Integer.Parse(matchResult.Groups(9).Value) ' 计算时区偏移量 Dim timeOffset As TimeSpan = New TimeSpan(offsetHour * If(sign = "+", 1, -1), offsetMinute, 0) ' 构造带时区的DateTimeOffset对象 Dim targetDate As New DateTimeOffset(year, month, day, hour, minute, second, timeOffset) ' 后续按需使用即可 Console.WriteLine(targetDate.LocalDateTime.ToString()) End If
兼容特殊情况
如果遇到以Z结尾的UTC日期(如D:202208171132Z),只需先将Z替换为+00:00,再用方法一解析即可:
Dim pdfDateStr As String = "D:202208171132Z" Dim cleanedStr As String = pdfDateStr.Substring(2).Replace("Z", "+00:00") Dim dateOffset As DateTimeOffset = DateTimeOffset.ParseExact(cleanedStr, "yyyyMMddHHmmzzz", Globalization.CultureInfo.InvariantCulture)
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

