C# 在C中将字符串解析为DateTime#

C# 在C中将字符串解析为DateTime#,c#,.net,string,parsing,datetime,C#,.net,String,Parsing,Datetime,我有日期和时间格式如下的字符串: "2011-03-21 13:26" //year-month-day hour:minute 如何将其解析为System.DateTime 如果可能的话,我想使用诸如DateTime.Parse()或DateTime.ParseExact()之类的函数来手动指定日期的格式。DateTime.Parse()将尝试找出给定日期的格式,通常效果很好。如果您可以保证日期始终采用给定格式,则可以使用ParseExact(): (但请注意,如果日期不是预期格式,通常使用

我有日期和时间格式如下的字符串:

"2011-03-21 13:26" //year-month-day hour:minute
如何将其解析为
System.DateTime

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

DateTime.Parse()
将尝试找出给定日期的格式,通常效果很好。如果您可以保证日期始终采用给定格式,则可以使用
ParseExact()

(但请注意,如果日期不是预期格式,通常使用TryParse方法之一更安全)

在构造格式字符串时,请务必进行检查,尤其要注意字母数和大小写(即“MM”和“MM”的含义非常不同)

C#格式字符串的另一个有用资源是

请查看其他格式字符串

DateTime.Parse()对于该字符串格式应该可以正常工作。参考:


是否为您引发FormatException?

将人类可读字符串的值放入.NET DateTime中,代码如下:

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

正如我在后面解释的,我总是喜欢
TryParse
TryParseExact
方法。因为它们使用起来有点笨重,所以我编写了一个扩展方法,它使解析变得更容易:

var dtStr=“2011-03-21 13:26”; 约会时间?dt=dtStr.ToDate(“yyyy-MM-dd-HH:MM”); 或者更简单地说,如果您想隐式地使用当前区域性的日期模式,您可以像这样使用它:

DateTime?dt=dtStr.ToDate();
在这种情况下,不需要指定特定的模式

Parse
ParseExact
等不同,它不会引发异常,并允许您通过

if(dt.HasValue){//继续处理}else{//执行错误处理}

转换是否成功(在本例中,
dt
有一个值,您可以通过
dt.value
)访问该值(在本例中,该值为
null

这甚至允许使用优雅的快捷方式,如“Elvis”-操作符
?。
,例如:

int?年份=dtStr?ToDate(“yyyy-MM-dd-HH:MM”)?年份;
在此,您还可以使用
year.HasValue
检查转换是否成功,如果转换未成功,则
year
将包含
null
,否则日期的年份部分。如果转换失败,则不会引发异常


解决方案:.ToDate()扩展方法

公共静态类扩展
{
///将日期字符串解析为日期时间的扩展方法?
/// 
/// 
///要分析的日期字符串
///dateFmt是可选的,允许通过
///传递的分析模式数组或一个或多个模式
///作为字符串参数
///已解析的日期时间或空
公共静态DateTime?ToDate(此字符串dateTimeStr,参数字符串[]dateFmt)
{
//示例:var dt=“2011-03-21 13:26”。ToDate(新字符串[]{“yyy-MM-dd HH:MM”,
//“M/d/yyyy h:mm:ss tt”});
//或更简单:
//var dt=“2011-03-21 13:26”。ToDate(“yyyy-MM-dd-HH:MM”、“M/d/yyyy-h:MM:ss tt”);
常量DateTimeStyles style=DateTimeStyles.AllowHiteSpaces;
if(dateFmt==null)
{
var dateInfo=System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
dateFmt=dateInfo.GetAllDateTimePatterns();
}
var result=DateTime.TryParseExact(dateTimeStr、dateFmt、CultureInfo.InvariantCulture、,
样式,out var dt)?dt:null作为日期时间?;
返回结果;
}
}

有关代码的一些信息

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

更新:
.ToDate()
(无参数)现在默认为线程当前区域性的所有常见日期/时间模式
注意我们需要将
结果
dt
放在一起,因为
TryParseExact
不允许使用我们打算返回的
DateTime?
。 在C#Version 7中,您可以将
ToDate
函数简化如下:

//仅在C#7中:“DateTime dt;”-不再需要,隐式声明
如果(DateTime.TryParseExact)(dateTimeStr,dateFmt,
CultureInfo.InvariantCulture,style,out var dt)结果=dt;
或者,如果你喜欢更短的话:

//仅在C#7中:将结果声明为“一行”;-)
var result=DateTime.TryParseExact(dateTimeStr、dateFmt、CultureInfo.InvariantCulture、,
样式,输出变量(dt)?dt:日期时间为空?;
在这种情况下,您不需要这两个声明
DateTime?结果=空
日期时间dt一点也不-您可以在一行代码中完成。
(如果您愿意,它还可以写入
out DateTime dt
而不是
out var dt

旧的C#风格需要以下方式(我从上面的代码中删除了这一点):

//日期时间?结果=空;
//日期时间dt;
//如果(DateTime.TryParseExact)(dateTimeStr,dateFmt,
//CultureInfo.InvariantCulture,style,out dt)结果=dt;
我使用
params
关键字进一步简化了代码:现在您不再需要第二个重载方法


用法示例


var dateStr = @"2011-03-21 13:26";
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm", CultureInfo.CurrentCulture);
DateTime.ParseExact("April 16, 2011 4:27 pm", "MMMM d, yyyy h:mm tt", null);
var dateStr = "2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr, "yyyy-MM-dd hh:mm");
var anotherParsedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
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.
 * */
Month = Date = DateTime.Now.Month.ToString();   
Year = DateTime.Now.Year.ToString(); 
ViewBag.Today = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(Int32.Parse(Month)) + Year;