在vb.net中如何将美式DateTime转换为英式日期并返回DateTime类型
核心认知误区
DateTime 是不带格式属性的纯值类型,它的内部存储是自公元0001年1月1日起累计的100纳秒时间计数,本质是一个长整数值。日常说的“美式日期”“英式日期”,只是将 DateTime 实例转换为字符串文本时,按照不同区域文化规则生成的展示效果,不是 DateTime 本身携带的固有属性。
你观察到输出仍为02/24/2021 12:00:00的核心原因,不是你的转换逻辑没生效,而是控制台打印DateTime时,默认使用当前系统的区域文化(此处为美式en-US规则)将其转为了字符串,和你中途的格式转换操作没有关系。
现有代码的逻辑冗余与问题
- 整个“先把DateTime转成英式格式字符串,再解析回DateTime”的操作完全无效:你从一开始拿到的
dateTimeIn就已经是DateTime类型,不是需要解析的字符串格式美式日期。转字符串再解析回DateTime的操作,最终得到的结果和原dateTimeIn是完全相等的同一个时间实例,没有任何“修改格式”的作用——因为DateTime本身不存在可修改的格式字段。 - 打印环节的默认格式化规则盖过了你的设置:
Console.WriteLine(covertToUkDateTimeToDate)会自动调用DateTime的无参ToString方法,该方法默认使用当前线程的CurrentCulture规则生成文本。如果当前系统文化为美式英语,就会输出MM/dd/yyyy结构的美式日期文本,和你之前的格式转换没有关联。 - 原有解析逻辑存在格式偏差风险:你使用的格式串
"dd/MM/yyyy hh:mm:ss"里的hh是12小时制标记,缺少AM/PM标识时无法正确识别下午时段的时间,实际开发中如果需要24小时制展示,应将hh替换为HH。
正确的实现方式
如果你的需求是「接收DateTime类型入参,返回DateTime类型结果」,不需要做任何额外转换——DateTime实例本身没有格式属性,入参代表哪个时间点,返回的结果就是完全对等的DateTime值。
如果你的实际需求是「以英式格式展示时间」,只需要在最终转文本展示的环节显式指定英式文化规则即可,不需要在中途做字符串中转:
Dim dateTimeIn As Date = #02/24/2021 12:00:00# ' 直接以en-GB文化规则格式化输出即可,无需中转字符串再解析回DateTime Dim ukFormattedOutput As String = dateTimeIn.ToString(New CultureInfo("en-GB")) Console.WriteLine(ukFormattedOutput) ' 输出结果为 24/02/2021 12:00:00,符合英式日期格式要求 ' 如果需要返回DateTime类型,直接返回原入参即可,不存在格式问题 Dim resultDate As Date = dateTimeIn
内容的提问来源于stack exchange,提问作者Byronation
相关产品推荐
相关产品推荐

