VB.Net Framework4.8中带PM的字符串转Date无效问题求解
解决VB.Net从Access读取日期时的InvalidCastException错误
问题根源
你的代码有几个关键问题:
- 多余的类型转换:如果
Field1在Access里是日期/时间类型,你先把它转成格式化字符串,再用CDate转回去,完全没必要,还引入了区域格式依赖问题。 - 格式不匹配:错误提示里的日期字符串带秒(
06/23/2016 06:04:39 PM),但你用ToString("MM/dd/yyyy hh:mm tt")格式化时丢了秒部分,后续CDate解析时会因为格式不兼容报错。 CDate依赖系统区域:如果你的系统默认日期格式不是MM/dd/yyyy(比如中文系统常用yyyy/MM/dd),直接转这种格式的字符串必然失败。
最优解决方案(数据库字段为日期类型时)
直接从DataReader读取日期类型,再格式化输出,跳过多余的字符串转Date步骤:
' 直接强转成Date类型,再按需要格式化字符串 menu.SubItems.Add(DirectCast(dr("Field1"), Date).ToString("MM/dd/yyyy hh:mm tt"))
如果需要处理字段为空的情况:
If Not dr.IsDBNull(dr.GetOrdinal("Field1")) Then Dim fieldDate As Date = DirectCast(dr("Field1"), Date) menu.SubItems.Add(fieldDate.ToString("MM/dd/yyyy hh:mm tt")) Else menu.SubItems.Add("无日期") End If
兼容字符串存储日期的方案
如果Field1在Access里是字符串类型存储的日期,用Date.TryParseExact指定精确格式和文化,彻底避免区域依赖:
Dim dateStr As String = dr("Field1").ToString().Trim() Dim parsedDate As Date ' 匹配错误提示里的完整日期格式(带秒) If Date.TryParseExact(dateStr, "MM/dd/yyyy hh:mm:ss tt", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, parsedDate) Then menu.SubItems.Add(parsedDate.ToString("MM/dd/yyyy hh:mm tt")) Else ' 转换失败时的兜底处理 menu.SubItems.Add("无效日期") End If
内容的提问来源于stack exchange,提问作者Jassim S
相关产品推荐
相关产品推荐

