ZetCode

C# DateTime 解析

最后修改于 2023 年 7 月 5 日

C# DateTime 解析教程展示了如何在 C# 中将字符串转换为 DateTime 对象。

C# DateTime

DateTime 值类型表示日期和时间,值的范围从公元 (Common Era) 0001 年 1 月 1 日 00:00:00(午夜)到公元 (C.E.) 9999 年 12 月 31 日 23:59:59,采用公历。

解析方法

DateTime.Parse 将日期时间字符串转换为 DateTime。它自动尝试确定日期时间格式。

DateTime.ParseExact 方法将日期时间的指定字符串表示形式转换为 DateTime。日期时间字符串格式必须与指定的格式完全匹配;否则会引发异常。

日期和时间与文化有关;这些方法要么使用当前文化,要么接受特定文化。

C# DateTime.Parse

我们使用 DateTime.Parse 将日期时间字符串转换为 DateTime

Program.cs
string[] dates = {
    "03/19/2021 07:20:58",
    "03/19/2021",
    "3/2021",
    "3/21",
    "4 AM",
    "2021-03-19T05:20:12.0000000Z",
    "2021-03-19T05:20:12.0000000-05:00",
    "Fri, 19 Mar 2021 05:20:12 GMT",
    "2021-03-19 05:20:12 -5:00",
};

foreach (var ds in dates)
{
    var dt = DateTime.Parse(ds);
    Console.WriteLine(dt);
}

我们在数组中有一堆日期时间字符串。我们使用 DateTime.Parse 将它们转换为 DateTime 对象。

$ dotnet run
3/19/2021 7:20:58 AM
3/19/2021 12:00:00 AM
3/1/2021 12:00:00 AM
3/21/2022 12:00:00 AM
3/24/2022 4:00:00 AM
3/19/2021 6:20:12 AM
3/19/2021 11:20:12 AM
3/19/2021 6:20:12 AM
3/19/2021 11:20:12 AM

C# DateTime.ParseExact

使用 DateTime.ParseExact,我们显式指定日期时间字符串的格式。

Program.cs
using System.Globalization;

var ds = "Thu Nov 11, 2021";
var dt = DateTime.ParseExact(ds, "ddd MMM dd, yyyy", CultureInfo.CurrentCulture);
Console.WriteLine(dt);

var ds2 = "10-22-2015";
var dt2 = DateTime.ParseExact(ds2, "MM-dd-yyyy", CultureInfo.CurrentCulture);
Console.WriteLine(dt2);

DateTime.ParseExact 的第二个参数是日期时间字符串的格式。第三个参数是文化。

$ dotnet run
11/11/2021 12:00:00 AM
10/22/2015 12:00:00 AM

C# DateTime FormatException

如果 DateTime.Parse 方法失败,它会抛出一个 FormatException

Program.cs
string ds = "11/31/2021";

try
{
    DateTime dt = DateTime.Parse(ds);
    Console.WriteLine($"{dt:d MMMM, yyyy}");
}
catch (FormatException e)
{
    Console.WriteLine("failed to parse string");
    Console.WriteLine(e);
}

在示例中,我们处理一个 FormatException

$ dotnet run
failed to parse string
System.FormatException: String '11/31/2021' was not recognized as a valid DateTime.
...

C# DateTime.TryParse

DateTime.TryParse 方法将指定的日期时间字符串转换为 DateTime。它返回一个布尔值,指示转换是否成功。它将字符串解析到其参数中。

Program.cs
string ds = "11/31/2021";

DateTime dt;
var ok = DateTime.TryParse(ds, out dt);

if (ok)
{
    Console.WriteLine($"{dt:d MMMM, yyyy}");
}
else
{
    Console.WriteLine("failed to parse datetime string");
}

在示例中,我们尝试解析一个日期时间字符串。如果该方法成功,我们会打印解析后的对象;否则,我们会打印一个错误消息,表明它失败了。

C# DateTime.Parse 与 CultureInfo

日期和时间与文化有关。如果使用非默认文化,我们需要将文化信息传递给解析方法。

Program.cs
using System.Globalization;

string[] dates =
{
    "piatok 12. novembra 2021 8:34:10",
    "12. 11. 2021",
    "pi, 12 nov 2021",
};

var skSk = new CultureInfo("sk-SK");
CultureInfo.DefaultThreadCurrentCulture = skSk;

foreach (var ds in dates)
{
    var dt = DateTime.Parse(ds, skSk);
    Console.WriteLine(dt);
}

在示例中,我们解析了用斯洛伐克文化编写的三个日期。文化作为 DateTime.Parse 方法的第二个参数传递。

$ dotnet run
12. 11. 2021 8:34:10
12. 11. 2021 0:00:00
12. 11. 2021 0:00:00

C# 解析 Last-Modified 标头值

Last-Modified 响应 HTTP 标头包含原始服务器认为资源上次修改的日期时间。

Program.cs
var url = "http://webcode.me";
using var client = new HttpClient();
var res = await client.GetAsync(url);

string lm = res.Content.Headers.GetValues("Last-Modified").First();
Console.WriteLine(lm);

var lmd = DateTime.Parse(lm);
Console.WriteLine(lmd);

在示例中,我们解析了 HTTP 响应的 Last-Modified 标头值。

$ dotnet run 
Sun, 23 Jan 2022 10:39:25 GMT
1/23/2022 11:39:25 AM

来源

DateTime.Parse 方法

在本文中,我们已将字符串解析为 C# 中的 DateTime 对象。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 C# 教程