关于.net:在C#中将字符串解析为DateTime

Parse string to DateTime in C#

我的日期和时间的格式是这样的:

1
"2011-03-21 13:26" //year-month-day hour:minute

如何将其解析为System.DateTime

如果可能的话,我想使用像DateTime.Parse()DateTime.ParseExact()这样的函数来手动指定日期的格式。


将尝试在给定日期的格式中找到一份好工作。如果你能保证日期总是在一个格式中,那么你可以使用ParseExact()

1
2
3
4
string s ="2011-03-21 13:26";

DateTime dt =
    DateTime.ParseExact(s,"yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);

(但注意到这通常是安全的使用一种胰蛋白酶方法,以一个日期为准,而不是预期的格式)

在构建格式条纹时,确保检查自定义日期和时间格式条纹,特别是注意字母和案件的数目(I.E."mm"和"mm"mean very different things)。

另一个C 355使用资源;格式弦乐为C 355格式格式;


正如我稍后所解释的,我总是倾向于使用TryParseTryParseExact方法。因为它们有点笨重,所以我编写了一个扩展方法,使解析更加容易:好的。

1
2
var    dtStr ="2011-03-21 13:26";
DateTime? dt = dtStr.ToDate("yyyy-MM-dd HH:mm");

ParseParseExact等不同,它不抛出异常,允许您通过好的。

江户十一〔四〕号好的。

转换是否成功(在本例中,dt具有您可以通过dt.Value访问的值)(在本例中,它是null的值)。好的。

这甚至允许使用像"elvis"这样优雅的快捷方式,例如,运算符?.:好的。

1
int? year = dtStr?.ToDate("yyyy-MM-dd HH:mm")?.Year;

在这里,您还可以使用year.HasValue来检查转换是否成功,如果转换没有成功,那么year将包含null,否则是日期的年份部分。如果转换失败,则不会引发异常。好的。

解决方案:todate()扩展方法好的。

试试看。网提琴好的。

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
public static class Extensions
{
    // Extension method parsing a date string to a DateTime?
    // dateFmt is optional and allows to pass a parsing pattern array
    // or one or more patterns passed as string parameters
    public static DateTime? ToDate(this string dateTimeStr, params string[] dateFmt)
    {
      // example: var dt ="2011-03-21 13:26".ToDate(new string[]{"yyyy-MM-dd HH:mm",
      //                                                 "M/d/yyyy h:mm:ss tt"});
      // or simpler:
      // var dt ="2011-03-21 13:26".ToDate("yyyy-MM-dd HH:mm","M/d/yyyy h:mm:ss tt");
      const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces;
      if (dateFmt == null)
      {
        var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        dateFmt=dateInfo.GetAllDateTimePatterns();
      }
      // Commented out below because it can be done shorter as shown below.
      // For older C# versions (older than C#7) you need it like that:
      // DateTime? result = null;
      // DateTime dt;
      // if (DateTime.TryParseExact(dateTimeStr, dateFmt,
      //    CultureInfo.InvariantCulture, style, out dt)) result = dt;
      // In C#7 and above, we can simply write:
      var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture,
                   style, out var dt) ? dt : null as DateTime?;
      return result;
    }
}

关于代码的一些信息好的。

您可能会奇怪,为什么我使用InvariantCulture调用TryParseExact:这是为了强制函数以相同的方式处理格式模式(否则,例如"."可以在英语中解释为十进制分隔符,而在德语中则是组分隔符或日期分隔符)。回想一下,我们之前已经查询过基于区域性的格式字符串,所以这里没问题。好的。

更新:.ToDate()(不带参数)现在默认为线程当前区域性的所有通用日期/时间模式。< BR>注意,我们需要resultdt一起使用,因为TryParseExact不允许使用DateTime?,我们打算返回。在C版本7中,您可以将ToDate功能简化一点,如下所示:好的。

1
2
3
 // in C#7 only:"DateTime dt;" - no longer required, declare implicitly
 if (DateTime.TryParseExact(dateTimeStr, dateFmt,
     CultureInfo.InvariantCulture, style, out var dt)) result = dt;

或者,如果你喜欢更短的:好的。

1
2
3
 // in C#7 only: Declaration of result as a"one-liner" ;-)
 var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture,
              style, out var dt) ? dt : null as DateTime?;

在这种情况下,您根本不需要DateTime? result = null;DateTime dt;这两个声明—您可以用一行代码来实现。(如果您愿意,也可以写out DateTime dt,而不是out var dt)。好的。

我使用params关键字进一步简化了代码:现在您不再需要第二个重载方法了。好的。

使用示例好的。

1
2
3
4
5
6
7
8
9
10
11
var dtStr="2011-03-21 13:26";    
var dt=dtStr.ToDate("yyyy-MM-dd HH:mm");
if (dt.HasValue)
{
    Console.WriteLine("Successful!");
    // ... dt.Value now contains the converted DateTime ...
}
else
{
    Console.WriteLine("Invalid date format!");
}

如您所见,这个示例只是查询dt.HasValue以查看转换是否成功。作为一个额外的好处,typarseexact允许指定严格的DateTimeStyles,这样您就可以确切地知道是否传递了正确的日期/时间字符串。好的。

更多用法示例好的。

重载函数允许您传递用于分析/转换日期的有效格式数组,如这里所示(TryParseExact直接支持这一点),例如。好的。

1
2
3
4
5
6
7
string[] dateFmt = {"M/d/yyyy h:mm:ss tt","M/d/yyyy h:mm tt",
                    "MM/dd/yyyy hh:mm:ss","M/d/yyyy h:mm:ss",
                    "M/d/yyyy hh:mm tt","M/d/yyyy hh tt",
                    "M/d/yyyy h:mm","M/d/yyyy h:mm",
                    "MM/dd/yyyy hh:mm","M/dd/yyyy hh:mm"};
var dtStr="5/1/2009 6:32 PM";
var dt=dtStr.ToDate(dateFmt);

如果您只有几个模板模式,您还可以编写:好的。

1
2
var dateStr ="2011-03-21 13:26";
var dt = dateStr.ToDate("yyyy-MM-dd HH:mm","M/d/yyyy h:mm:ss tt");

高级示例
好的。

您可以使用??运算符默认为故障安全格式,例如好的。

1
2
var dtStr ="2017-12-30 11:37:00";
var dt = (dtStr.ToDate()) ?? dtStr.ToDate("yyyy-MM-dd HH:mm:ss");

在这种情况下,.ToDate()将使用通用的本地文化日期格式,如果所有这些格式都失败,它将尝试使用ISO标准格式"yyyy-MM-dd HH:mm:ss"作为回退。这样,扩展函数就可以轻松地"链接"不同的回退格式。好的。

你甚至可以在linq中使用扩展,试试这个(它在上面的.netfiddle中):好的。

1
2
var patterns=new[] {"dd-MM-yyyy","dd.MM.yyyy" };
(new[] {"15-01-2019","15.01.2019" }).Select(s => s.ToDate(patterns)).Dump();

它将使用模式即时转换数组中的日期,并将其转储到控制台。好的。

胰蛋白酶抑制剂的一些背景好的。

最后,这里有一些关于背景的评论(也就是为什么我这样写的原因):好的。

我更喜欢在这个扩展方法中使用TryparSeeXact,因为您避免了异常处理——您可以阅读Eric Lippert关于异常的文章为什么应该使用Tryparse而不是Parse,我引用他关于那个主题的话:2)好的。

This unfortunate design decision1) [annotation: to
let the Parse method throw an exception] was so vexing that of course
the frameworks team implemented TryParse shortly thereafter which does the right thing.

Ok.

确实如此,但是TryParseTryParseExact的使用仍然不太方便:它们强制您使用未初始化的变量作为out参数,该参数不能为空,并且在转换时需要评估布尔返回值—要么必须立即使用if语句,要么将返回值存储在一个附加的布尔变量中,以便以后可以进行检查。如果不知道转换是否成功,就不能使用目标变量。好的。

在大多数情况下,您只想知道转换是否成功(当然,如果转换成功,也要知道值),所以保存所有信息的可以为空的目标变量是可取的,而且更优雅——因为整个信息只存储在一个地方:一致且易于使用,错误更少。-俯卧。好的。

我编写的扩展方法就是这样做的(它还向您展示了如果不使用它,每次都必须编写什么类型的代码)。好的。

我相信.ToDate(strDateFormat)的好处在于它看起来简单而干净——和最初的DateTime.Parse一样简单——但是能够检查转换是否成功,并且不会抛出异常。好的。

1)这里的意思是异常处理(即try { ... } catch(Exception ex) { ...}块)-这在使用parse时是必需的,因为如果解析无效字符串,它会抛出异常-在这种情况下不仅不必要,而且会使代码变得烦人和复杂。Tryparse避免了所有这些,因为我提供的代码示例正在显示。好的。

2)Eric Lippert是著名的StackOverflow研究员,曾在微软担任C编译器团队的主要开发人员几年。好的。好啊。


ZZU1

查看此链接,以便其它格式弦乐!


Datetime.Parse()should work fine for that string format.参考:

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx&350;y1240

这对你来说是个例外吗?


Put the value of a human-readable string into a net datetime with code like this:

1
DateTime.ParseExact("April 16, 2011 4:27 pm","MMMM d, yyyy h:mm tt", null);

简单而直截了当的答案

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
using System;

namespace DemoApp.App

{
public class TestClassDate
{
    public static DateTime GetDate(string string_date)
    {
        DateTime dateValue;
        if (DateTime.TryParse(string_date, out dateValue))
            Console.WriteLine("Converted '{0}' to {1}.", string_date, dateValue);
        else
            Console.WriteLine("Unable to convert '{0}' to a date.", string_date);
        return dateValue;
    }
    public static void Main()
    {
        string inString ="05/01/2009 06:32:00";
        GetDate(inString);
    }
}
}

/**
 * Output:
 * Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
 * */


你也可以使用xmlconvert.todatestring

1
2
var dateStr ="2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr,"yyyy-MM-dd hh:mm");

It is good to specify the date kind,the code is:

1
var anotherParsedDate = DateTime.ParseExact(dateStr,"yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

More details on different parsing options http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html


试着跟随代码

1
2
3
Month = Date = DateTime.Now.Month.ToString();  
Year = DateTime.Now.Year.ToString();
ViewBag.Today = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(Int32.Parse(Month)) + Year;