WinForm向WebService传DateTime格式不符及ParseExact报错排查
问题解决步骤
1. 修复Date.ParseExact的异常问题
你的输入字符串是2023-11-7 16:15:48,其中日是单个数字(7),但你使用的格式串yyyy-MM-dd HH:mm:ss中的dd要求两位数字的日期(比如07),格式不匹配导致报错。
解决方法:
使用兼容单/双位数日的格式串:
Dim DummyDate As DateTime DummyDate = Date.ParseExact(Datos(1), "yyyy-MM-d HH:mm:ss", CultureInfo.InvariantCulture)
如果输入字符串中月、日可能出现单/双位数的混合情况(比如2023-9-5或2023-10-15),可以用格式数组提高兼容性:
Dim formats() As String = {"yyyy-MM-d HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy-M-d HH:mm:ss", "yyyy-M-dd HH:mm:ss"} Dim DummyDate As DateTime = Date.ParseExact(Datos(1), formats, CultureInfo.InvariantCulture, DateTimeStyles.None)
2. 解决WebService接收DateTime格式为mm/dd/YYYY的问题
DateTime对象本身没有格式,问题出在**.NET客户端向WebService序列化DateTime的过程**——默认情况下客户端会使用当前线程的文化(比如美式en-US)生成mm/dd/YYYY格式的字符串,而对方期望欧式dd/mm/YYYY格式。
解决方法:
方法一:临时切换线程文化(简单直接)
在调用WebService前,将当前线程的文化切换为期望的格式文化(比如英式en-GB),调用完成后恢复原文化:
Imports System.Globalization Imports System.Threading ' 保存原文化设置 Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture Dim originalUICulture As CultureInfo = Thread.CurrentThread.CurrentUICulture Try ' 切换到目标文化(en-GB对应dd/mm/yyyy格式) Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB") Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB") ' 调用WebService方法,传入DateTime对象 YourWebServiceClient.TargetMethod(DummyDate) Finally ' 恢复原文化设置 Thread.CurrentThread.CurrentCulture = originalCulture Thread.CurrentThread.CurrentUICulture = originalUICulture End Try
方法二:修改WebService代理类的序列化属性(持久化)
如果你通过添加Web引用生成了代理类,可以通过自定义属性强制DateTime的序列化格式。注意:直接修改自动生成的代理类会在更新Web引用时被覆盖,建议用部分类扩展:
Imports System.Xml.Serialization Partial Public Class YourWebServiceProxyClassName ' 覆盖原日期属性,指定序列化格式 <XmlElement(Format:="dd/MM/yyyy HH:mm:ss")> Public Shadows Property YourDateProperty As DateTime End Class
额外注意:
如果对方服务期望UTC时间,建议将DateTime转换为UTC后再发送,避免时区差异导致的解析问题:
DummyDate = DummyDate.ToUniversalTime()
内容的提问来源于stack exchange,提问作者E_Blue
相关产品推荐
相关产品推荐

