Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将第一天字符串转换为日期时间_C#_Datetime - Fatal编程技术网

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日