C# 将第一天字符串转换为日期时间
我正在寻找一种能够转换如下日期字符串的方法:C# 将第一天字符串转换为日期时间,c#,datetime,C#,Datetime,我正在寻找一种能够转换如下日期字符串的方法: "1st Oct 2018" => 2018-10-01 或者这个: "10th Mar 2015" => 2015-03-10 它相当于字符串,格式为yyyy-mm-dd。我尝试了以下代码,但没有成功: DateTime dt = DateTime.ParseExact(stringDate, "yyyy mm dd", CultureInfo.InvariantCulture); DateTime值没有格式-它只是一个值。(就像
"1st Oct 2018" => 2018-10-01
或者这个:
"10th Mar 2015" => 2015-03-10
它相当于字符串
,格式为yyyy-mm-dd
。我尝试了以下代码,但没有成功:
DateTime dt = DateTime.ParseExact(stringDate, "yyyy mm dd", CultureInfo.InvariantCulture);
DateTime
值没有格式-它只是一个值。(就像int
本身不是十进制或十六进制一样,当您将其转换为字符串时,您可以选择如何格式化它,默认情况下使用十进制。)
传递到DateTime.ParseExact
的字符串是预期的输入格式,而字符串的格式不是“yyyy-mm-dd”。(请注意,在日期/时间格式字符串中,“mm”表示分钟,因此您可能希望使用“mm”而不是“mm”…但这在这里没有帮助。)
您的日期格式几乎是“d MMM yyy”(天,短月名,年),使用的是英文月名-但问题是顺序部分(“st”、“nd”、“th”)。据我所知,使用DateTime.ParseExact
没有简单的方法来处理这个问题。相反,我可能会使用正则表达式或简单的字符串替换来删除序号部分,这样您就有了一个格式为“d MMM yyy”的字符串,然后对其进行解析
对于字符串替换部分,的答案是适当的。下面是一个使用示例数据的完整示例:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Console.WriteLine(ParseWithOrdinals("10th Mar 2015"));
Console.WriteLine(ParseWithOrdinals("1st Oct 2018"));
}
private static DateTime ParseWithOrdinals(string input) =>
DateTime.ParseExact(
RemoveOrdinals(input), // Text to parse
"d MMM yyyy", // Format of text
CultureInfo.InvariantCulture); // Expect English month names, Gregorian calendar
// From https://stackoverflow.com/questions/17710561
private static string RemoveOrdinals(string input) =>
input
.Replace("0th", "0")
.Replace("1st", "1")
.Replace("2nd", "2")
.Replace("3rd", "3")
.Replace("11th", "11") // Need to handle these separately...
.Replace("12th", "12")
.Replace("13th", "13")
.Replace("4th", "4")
.Replace("5th", "5")
.Replace("6th", "6")
.Replace("7th", "7")
.Replace("8th", "8")
.Replace("9th", "9");
}
(请注意,我在输出中没有将结果格式化为yyyy MM dd,因此您将获得本地日期/时间格式。)A
DateTime
值没有格式-它只是一个值。(就像int
本身不是十进制或十六进制一样,当您将其转换为字符串时,您可以选择如何格式化它,默认情况下使用十进制。)
传递到DateTime.ParseExact
的字符串是预期的输入格式,而字符串的格式不是“yyyy-mm-dd”。(请注意,在日期/时间格式字符串中,“mm”表示分钟,因此您可能希望使用“mm”而不是“mm”…但这在这里没有帮助。)
您的日期格式几乎是“d MMM yyy”(天,短月名,年),使用的是英文月名-但问题是顺序部分(“st”、“nd”、“th”)。据我所知,使用DateTime.ParseExact
没有简单的方法来处理这个问题。相反,我可能会使用正则表达式或简单的字符串替换来删除序号部分,这样您就有了一个格式为“d MMM yyy”的字符串,然后对其进行解析
对于字符串替换部分,的答案是适当的。下面是一个使用示例数据的完整示例:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Console.WriteLine(ParseWithOrdinals("10th Mar 2015"));
Console.WriteLine(ParseWithOrdinals("1st Oct 2018"));
}
private static DateTime ParseWithOrdinals(string input) =>
DateTime.ParseExact(
RemoveOrdinals(input), // Text to parse
"d MMM yyyy", // Format of text
CultureInfo.InvariantCulture); // Expect English month names, Gregorian calendar
// From https://stackoverflow.com/questions/17710561
private static string RemoveOrdinals(string input) =>
input
.Replace("0th", "0")
.Replace("1st", "1")
.Replace("2nd", "2")
.Replace("3rd", "3")
.Replace("11th", "11") // Need to handle these separately...
.Replace("12th", "12")
.Replace("13th", "13")
.Replace("4th", "4")
.Replace("5th", "5")
.Replace("6th", "6")
.Replace("7th", "7")
.Replace("8th", "8")
.Replace("9th", "9");
}
(注意,我在输出中没有将结果格式化为yyyy-MM-dd,因此您将获得您的本地日期/时间格式。)除了Daisy的精彩回答之外:
[TestCase("15th Oct 2018")]
[TestCase("1st Oct 2018")]
[TestCase("2nd Oct 2018")]
[TestCase("3rd Oct 2018")]
[TestCase("3d Oct 2018")]
public void Action(string dateStr)
{
// Act
var dt = DateTime.ParseExact(Regex.Replace(dateStr, "(th|st|nd|rd|d)", ""), "d MMM yyyy", CultureInfo.CurrentCulture);
//Assert
Console.WriteLine(dt);
}
UPD:添加了Dmitry Bychenko的精彩建议。除了Daisy的精彩回答:
[TestCase("15th Oct 2018")]
[TestCase("1st Oct 2018")]
[TestCase("2nd Oct 2018")]
[TestCase("3rd Oct 2018")]
[TestCase("3d Oct 2018")]
public void Action(string dateStr)
{
// Act
var dt = DateTime.ParseExact(Regex.Replace(dateStr, "(th|st|nd|rd|d)", ""), "d MMM yyyy", CultureInfo.CurrentCulture);
//Assert
Console.WriteLine(dt);
}
UPD:添加了Dmitry Bychenko的优秀建议。还有一种没有字符串remove/replace/Regex的本地方法 如果知道这些字符,可以在日期模式中使用
“
字符对其进行转义。因此,“2018年10月15日”
适用于这种模式“年月日”
现在有了“st”、“nd”、“rd”、“th”
,因此您可以尝试其中的每一个,并选择工作的一个
到的重载中,可以传递一系列允许的格式
string input = "15th Oct 2018";
DateTime result = DateTime.Now;
string[] patterns = { "d'st' MMM yyyy", "d'nd' MMM yyyy", "d'rd' MMM yyyy", "d'th' MMM yyyy"};
bool success = DateTime.TryParseExact(input, patterns, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
if (success)
Console.WriteLine(result.ToString("yyyy-MM-dd"));
还有一种不使用字符串remove/replace/Regex的本机方法 如果知道这些字符,可以在日期模式中使用
“
字符对其进行转义。因此,“2018年10月15日”
适用于这种模式“年月日”
现在有了“st”、“nd”、“rd”、“th”
,因此您可以尝试其中的每一个,并选择工作的一个
到的重载中,可以传递一系列允许的格式
string input = "15th Oct 2018";
DateTime result = DateTime.Now;
string[] patterns = { "d'st' MMM yyyy", "d'nd' MMM yyyy", "d'rd' MMM yyyy", "d'th' MMM yyyy"};
bool success = DateTime.TryParseExact(input, patterns, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
if (success)
Console.WriteLine(result.ToString("yyyy-MM-dd"));
您是否看到2015年3月10日<代码>和<代码>之间的差距“yyyy-mm-dd”代码>“yyyy-mm-dd”不是目标格式,而是日期的当前格式。DateTime对象本身没有任何格式,仅在将日期转换为字符串时,通过
ToString()
(或类似)或通过调试器显示对其进行格式设置。-当然,你需要删除“dddd”部分。我认为你必须用一个函数删除“st”“nd”“th”,因为我读了另一个问题,问题正好相反,datetime类中没有内置函数。你是否看到了2015年3月10日和yyyy mm dd
yyyy mm dd之间的差距不是目标格式,而是日期的当前格式。DateTime对象本身没有任何格式,仅在将日期转换为字符串时,通过ToString()
(或类似)或通过调试器显示对其进行格式设置。-当然,你需要删除“dddd”部分。我认为你必须用一个函数删除“st”“nd”“th”,因为我读了另一个问题,问题正好相反,datetime类中没有内置函数。谢谢。如何在输出中获得类似2018-10-01的格式?你能考虑一下这个吗?J.P:你想看看如何将<代码> DATETIME>/代码>格式化为一个字符串,这是另外一回事。这是一个很好的起点。@fubo:您可以转义特定的字符;例如,你不能写“下一个字符是s或t”的模式。谢谢。如何在输出中获得类似2018-10-01的格式?你能考虑一下这个吗?J.P:你想看看如何将<代码> DATETIME>/代码>格式化为一个字符串,这是另外一回事。这是一个很好的起点。@fubo:您可以转义特定的字符;例如,您不能编写表示“下一个字符是s或t”的模式。Regex.Replace(dateStr),“((th | st | nd | rd)”,”)
稍微短一点(无需新建
)谢谢。如何在输出中获得类似2018-10-01的格式?你能考虑一下吗?我们经常把它作为<代码> 3D OCT,而不是<代码> 10月3日