NET问答: 为什么时间格式 dd/MM/yyyy 转成 DateTime 会报错?

DotNetCore实战

共 2299字,需浏览 5分钟

 · 2021-06-16


咨询区

  • Shantanu Gupta

我在项目中碰到了一个需求,需要将字符串格式的 dd/MM/yyyy 转成 DateTime,比如下面这样:


    class Program
    {
        static void Main(string[] args)
        {
            var str= "22/11/2009";

            DateTime date = DateTime.Parse(str);
        }
    }

但很不幸,我的代码抛出异常了。

请问我该如何解决?不过我还意外发现 Parse 方法还有一个 IFormatProvider 参数的重载,不清楚是否它能解决?如果可以的话该怎么传?

回答区

  • Samuel Neff

你可以使用 ParseExact 方法,它需要你指定强转成 DateTime 需要的字符串格式,方法签名如下:


public static DateTime ParseExact(string s, string format, IFormatProvider? provider){}

所以你应该像下面这样使用。


DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

值得一提的是,IFormatProvider 一定要适配该时间字符串格式的区域 Cluture,如果不确定的话,可以使用通用的 CultureInfo.InvariantCulture

  • Ricardo Sanchez

其实你抛异常的本质在于,你当前 Culture 的时间格式和你的需要强转的 字符串时间格式 是冲突的,要想解决的话,调整到正确的 Cluture 即可,参考如下代码。


    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);

或者改成这样。


using System.Globalization;

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("en-GB"));

更多细节,参考这个链接:http://msdn.microsoft.com/en-us/library/5hh873ya.aspx

点评区

这个问题我其实挺感慨的,去年做新加坡的项目就被这玩意坑过,我们中国的时间格式大多是:yyyy/MM/dd ,新加坡的格式是这样的:Fri 30 Oct 22 2009,对,你没有看错,居然还有英文字母缩写,这两格式之间倒来倒去,绝对让你防不胜防 😄😄😄


往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报