将字符串转换为 DateTime

Converting a String to DateTime

提问人: 提问时间:5/28/2009 最后编辑:one noa 更新时间:8/1/2022 访问量:1929434

问:

如何将字符串(例如)转换为?2009-05-08 14:40:52,531DateTime

C# 字符串 datetime 类型转换

评论

2赞 nam 5/8/2017
@dban 为什么回复未标记为答案?可能是有原因的——我很好奇。@CMS
6赞 YumeYume 8/14/2017
@nam用户删除了他的帐户,或被禁止,无法点击它,也无法看到声誉/奖章。可悲的是,我们所能做的就是给他竖起大拇指。

答:

163赞 gehsekky 5/28/2009 #1

试试这个

DateTime myDate = DateTime.Parse(dateString);

更好的方法是:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}
19赞 lc. 5/28/2009 #2

Convert.ToDateTimeDateTime.Parse

评论

0赞 esnezz 5/19/2022
在后台,Convert.ToDateTime 只是调用 DateTime.Parse
324赞 Sander 5/28/2009 #3

你基本上有两种选择。 和。DateTime.Parse()DateTime.ParseExact()

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

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

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

DateTime enteredDate = DateTime.Parse(enteredString);

如果字符串有特定的格式,则应使用其他方法:

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

"d"代表短日期模式(有关详细信息,请参阅 MSDN),并指定应使用当前区域性来分析字符串。null

932赞 Christian C. Salvadó 5/28/2009 #4

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

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

评论

0赞 lc. 5/28/2009
(不过,我认为您的意思是在日期和格式字符串中使用逗号,对吧?
1赞 hamish 8/25/2014
由于 OPs 欧洲区域设置,它只是一个逗号,如果您将该代码带到另一个具有 US 的服务器,该怎么办?区域设置,则部分的分数将是保存字符串上的小数点而不是逗号,并且您的解决方案将中断。在应用正确的解析器之前,请确保为传入日期时间字符串的类型添加检查,以获取其正确的区域设置。我很惊讶 Microsoft 还没有在 CLR 或 C#.net 的其他地方预生成此代码
1赞 Vinod Kumar 6/22/2016
无法将其转换为日期时间字符串 MyString = “06/22/1916 3:20:14 PM”;
0赞 jpaugh 9/8/2018
24 小时时间和逗号作为小数点分隔符不是自定义区域设置。它不应该需要特别处理。
16赞 Umair Baig 9/18/2011 #5
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

评论

1赞 Badhon Jain 9/30/2014
你错过了时间部分?我需要日期和时间,我该怎么做?
24赞 Krishna 11/7/2014 #6

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

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

评论

2赞 T.Todua 9/19/2017
没有人提到它仅适用于该特定格式。
0赞 Krishna 11/3/2018
可惜。。。🙂 程序员总是认为其他程序员会弄清楚......其实是件好事......让我们多想想......
15赞 dev.bv 4/14/2015 #7

如果您不确定输入值,也可以使用如下所示的 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
}
31赞 guneysus 5/23/2015 #8

似乎没有人实现扩展方法。借助@CMS的回答

工作和改进的完整源代码示例在这里:Gist Link

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}

评论

0赞 Yousha Aleayoub 12/18/2019
Nobody seems to implemented an extension method也许是因为不需要......
0赞 guneysus 12/18/2019
有时标准库不符合我们的需求。这就是为什么需要/使用帮助程序库的原因。使用扩展方法的方式,或者流利的 API ise 有点更喜欢 FP 而不是 OOP,反之亦然。既不对也不错。这是选择。@YoushaAleayoub
68赞 Amir Touitou 11/21/2016 #9

使用 DateTime.Parse(string):

DateTime dateTime = DateTime.Parse(dateTimeStr);
2赞 M.R.T 2/24/2017 #10

将此代码放在静态类中> public static class 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('-', ':', '-');
1赞 Saeed Dini 10/24/2017 #11

世界上不同的文化以不同的方式编写日期字符串。例如,在美国,2008 年 1 月 20 日是 2008 年 1 月 20 日。在法国,这将引发 InvalidFormatException。这是因为法国将日期时间读取为日/月/年,而在美国则为月/日/年。

因此,像 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);  
27赞 zeilja 3/19/2018 #12

我尝试了各种方法。对我有用的是:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data对我来说是这样的时间 9/24/2017 9:31:34 AM

评论

0赞 Birhan Nega 5/16/2020
看起来更好,可以将其值分配给 DateTime 变量吗?
16赞 Mr.B 2/27/2019 #13

DateTime.Parse

语法:

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););
  • 值:日期和时间的字符串表示形式。
  • Provider:提供特定于区域性信息的对象。
  • 样式:用于自定义某些日期和时间分析方法的字符串解析的格式选项。例如,AllowWhiteSpaces 是一个值,它有助于在解析字符串时忽略字符串中存在的所有空格。

还值得记住的是,DateTime 是一个在框架内部以数字形式存储的对象,Format 仅在将其转换回字符串时才适用于它。

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

  • 格式化:将内部数值转换为可读值 字符串。

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

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

完整的 DateTime 文档

2赞 Abdulhakim Zeinu 8/17/2019 #14
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

这个给你

2019-08-17 11:14:49.000
-2赞 Desmond 1/30/2020 #15

你想要快吗?

假设您有一个格式为 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);
10赞 guneysus 2/11/2020 #16

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

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"
3赞 Ravi Patil 8/1/2022 #17

这对我有用:

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