C# 将字符串转换为日期时间

C# 将字符串转换为日期时间,c#,datetime,C#,Datetime,如何将诸如2009-05-08 14:40:52531之类的字符串转换为DateTime?试试这个 DateTime myDate = DateTime.Parse(dateString); 更好的方法是: DateTime myDate; if (!DateTime.TryParse(dateString, out myDate)) { // handle parse failure } 或者你基本上有两个选择DateTime.Parse()和DateTime.ParseExact

如何将诸如
2009-05-08 14:40:52531之类的字符串转换为
DateTime

试试这个

DateTime myDate = DateTime.Parse(dateString);
更好的方法是:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}

或者你基本上有两个选择
DateTime.Parse()
DateTime.ParseExact()

第一个在语法方面非常宽容,将以许多不同的格式解析日期。它适用于不同格式的用户输入

ParseExact允许您指定用于解析的日期字符串的确切格式。如果字符串的格式始终相同,则最好使用此选项。这样,您就可以轻松地检测到与预期数据的任何偏差

您可以像这样解析用户输入:

DateTime enteredDate = DateTime.Parse(enteredString);
如果您有字符串的特定格式,则应使用其他方法:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

“d”
代表短日期模式(请参阅),并且
null
指定应使用当前区域性来解析字符串。

由于您处理的是基于24小时的时间,并且有一个逗号分隔秒数,因此我建议您指定一种自定义格式:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

请尝试以下选项,其中strDate是“MM/dd/yyyy”格式的日期

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

如果不确定输入值,也可以使用DateTime.TryParseExact(),如下所示

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}

似乎没有人实现扩展方法。借助于:

工作和改进的完整源代码示例如下:

使用:


将此代码放入静态类
>公共静态类ClassName{}

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}
通过这种方式,您可以使用

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

世界上不同的文化以不同的方式书写日期字符串。例如,在美国,2008年1月20日是2008年1月20日。在法国,这将引发一种无效的形式观念。这是因为法国的日期时间是日/月/年,而美国是月/日/年

因此,像20/01/2008这样的字符串将在法国解析到2008年1月20日,然后在美国抛出InvalidFormatException

要确定当前区域性设置,可以使用System.Globalization.CultureInfo.CurrentCulture

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  

我试过各种方法。对我有效的是:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data
对我来说是这样的时间2017年9月24日上午9:31:34

DateTime.Parse

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');
语法:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)
string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
示例:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)
string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • 值:日期和时间的字符串表示形式
  • 提供程序:提供区域性特定信息的对象
  • 样式:为某些日期和时间解析方法自定义字符串解析的格式选项。例如,AllowHiteSpaces是一个值,它有助于在解析字符串时忽略字符串中存在的所有空格
同样值得记住的是,DateTime是一个在框架内部存储为数字的对象,只有当您将其转换回字符串时,格式才适用于它

  • 正在解析将字符串转换为内部数字类型

  • 格式化将内部数值转换为可读的 绳子

我最近遇到了一个问题,我试图将DateTime转换为传递给Linq,但当时我没有意识到,在将DateTime传递给Linq查询时,格式是不相关的

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

这个给你

2019-08-17 11:14:49.000
你想快点吗

假设您有一个格式为yyMMdd的日期

我发现转换它的最快方法是:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')
只需根据您选择的日期格式选择索引即可。如果您需要速度,您可能不介意函数的“非泛型”方式

这种方法大约需要10%的时间:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);

我刚刚找到了一种优雅的方式:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

(我想你的意思是在日期和格式字符串中使用逗号,对吗?)它只是一个逗号,因为OPs欧洲语言环境设置,如果你将代码带到另一个具有US.Locale的服务器,那么节的分数将是十进制而不是保存字符串上的逗号,那么你的解决方案将中断。在应用正确的解析器之前,请确保为传入的datetime字符串的正确区域设置添加了类型检查。令我惊讶的是,微软在CLR或C#net的其他地方还没有预编译此代码。无法将其转换为日期时间字符串MyString=“06/22/1916 3:20:14 PM”;24小时时间和逗号作为十进制分隔符不是自定义区域设置。不需要特别处理。你错过了时间部分?我需要日期和时间,我该怎么做?@dban为什么
@CMS
的响应没有标记为答案?可能有原因-我很好奇。@nam用户删除了他的帐户,或者被禁止,不能点击它,也看不到声誉/奖牌。可悲的是,我们所能做的就是对他竖起大拇指。没有人提到它只适用于那种特定的格式。遗憾的是<代码>似乎没有人实现扩展方法
,可能是因为不需要…有时standart库不适合我们的需要。这就是为什么需要/使用助手库。使用扩展方法,或者fluentapi-ise有点倾向于FP而不是OOP,反之亦然。既不正确也不错误。这是选择@YoushaaleAyoublook更好,可以将其值赋给DateTime变量吗?
Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"