【问题标题】:Parsing non standard date strings in C#在 C# 中解析非标准日期字符串
【发布时间】:2017-08-30 22:34:08
【问题描述】:

您将如何处理以下需要转换为 DateTime 对象的字符串值?

"2015/01/22 12:08:51 (GMT+09:00)"

希望将此作为公认的 DateTime 模式。当我遇到其他格式时,我只想实现一个新模式。

【问题讨论】:

    标签: c# iformatprovider datetimeformatinfo


    【解决方案1】:

    这里有一段代码可以成功解析给定的字符串(注意DateTimeOffset而不是DateTime):

    var str = "2015/01/22 12:08:51 (GMT+09:00)";
    
    var dt = DateTimeOffset.ParseExact
        (str,
        "yyyy/MM/dd HH:mm:ss (\\G\\M\\TK)",
        System.Globalization.CultureInfo.InvariantCulture
        );
    //dt now has +9:00 offset - that's correct only if GMT is provided as UTC.
    

    更多信息The Difference Between GMT and UTC

    【讨论】:

    • 谢谢你。这就是我一直在寻找的。我只是无法正确获取格式字符串。另外,我什至没有想过要使用 DateTimeOffset。
    【解决方案2】:

    此代码接受一个字符串并将其转换为 DateTime 对象

    DateTime myDate = DateTime.Parse("2017-08-28 14:20:52,001", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
    

    您需要做的就是创建一个与您的输入相匹配的格式。此链接有助于: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

    更多详情请阅读:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/how-to-convert-a-string-to-a-datetime

    【讨论】:

      【解决方案3】:

      这里有 DateTime.Parse 的官方文档和一些示例。它还涵盖了其他格式的情况 https://msdn.microsoft.com/it-it/library/system.datetime.parse(v=vs.110).aspx

      【讨论】:

        【解决方案4】:

        使用DateTime.ParseExact 可能是您最好的选择。它接受输入字符串和输入应匹配的预期格式字符串。如果转换成功,它将返回trueout 参数将是转换的结果(下例中为result)。

        如果不强制删除“GMT”部分,我无法让它工作,但如果你可以接受,下面的代码应该可以工作。

        此示例采用原始输入并将其转换为 UTC 时间(即,它根据您的 GMT 值调整时间,在您的示例中减去 9 小时):

        var input = "2015/01/22 12:08:51 (GMT-08:00)";
        var format = "yyyy/MM/dd H:mm:ss (zzz)";
        
        DateTime result;
        
        // Remove the "GMT" portion of the input
        input = input.Replace("GMT", "");
        
        if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture,
            DateTimeStyles.AdjustToUniversal, out result))
        {
            Console.WriteLine($"'{input}' converts to {result} UTC time.");
        }
        else
        {
            Console.WriteLine($"'{input}' is not in the correct format.");
        }
        

        此示例根据DateTime.TryParseExact 文档中的示例进行了修改。

        【讨论】:

        • 谢谢鲁弗斯。我试图避免的一件事是首先需要操纵数据。我希望避免先删除 GMT。
        猜你喜欢
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多