关于C#:将string转换为datetime

Converting a String to DateTime

如何将诸如2009-05-08 14:40:52,531这样的字符串转换为DateTime字符串?


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

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


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

第一种方法在语法方面非常宽泛,可以用许多不同的格式解析日期。对于可能以不同格式输入的用户来说,这是很好的。

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

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

1
DateTime enteredDate = DateTime.Parse(enteredString);

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

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

"d"代表短日期模式(更多信息请参阅msdn),null指定当前区域性应用于分析字符串。


试试这个

1
DateTime myDate = DateTime.Parse(dateString);

更好的方法是:

1
2
3
4
5
DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}

似乎没有人实现扩展方法。在@cms回答的帮助下:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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)));
        }
    }
}

使用datetime.parse(字符串)

1
DateTime dateTime= DateTime.Parse(dateTimeStr);

尝试下面的方法,其中strdate是"mm/dd/yyyy"格式的日期

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


convert.todatetime或datetime.parse


1
2
3
4
5
6
7
8
9
10
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
Convert.ToDateTime(data, CultureInfo.InvariantCulture);

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


如果不确定输入值,也可以使用下面的datetime.typarseexact()。

1
2
3
4
5
6
7
8
9
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
}

日期时间解析

Syntax:

1
2
3
DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

例子:

1
2
3
string value ="1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • 值:日期和时间的字符串表示形式。
  • 提供程序:提供区域性特定信息的对象。
  • 样式:为某些日期和时间分析方法自定义字符串分析的格式选项。例如,allowHitespace是一个值,它有助于在解析字符串时忽略字符串中存在的所有空格。

值得记住的是,datetime是一个在框架内部存储为数字的对象,只有当您将其转换回字符串时,格式才适用于它。

  • 正在分析将字符串转换为内部数字类型的过程。

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

我最近遇到了一个问题,我试图将日期时间转换为传递给Linq,但当时我还没有意识到,当将日期时间传递给Linq查询时,格式与之无关。

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

完整的日期时间文档


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

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

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

1
2
3
4
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);

将此代码放入静态类中cx1〔4〕。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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();
   }
}

这样,您就可以使用

1
2
3
4
5
6
7
8
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('-', ':', '-');