使用另一个字符串作为模板将DateTime转换为字符串

时间:2015-03-10 19:38:24

标签: c# .net datetime

我有一个包含日期&的字符串某种形式的时间。例如:

13:53:56 20.08.2014

此字符串是从用户上传到我的服务的文件中解析的。确切日期&时间格式未知。它几乎可以改变任何日期和时间。你知道的时间格式。我没有预期格式或类似的列表。

我想开发一种算法,以某种方式从初始字符串中提取格式并将其应用于DateTime.Now。 有没有办法简单而优雅地做到这一点?

3 个答案:

答案 0 :(得分:2)

如果您知道预期格式列表,请定义它们并使用DateTime.TryParseExact()找出输入字符串的匹配格式。获得匹配格式后,您只需使用匹配格式DateTime.Now.ToString(format)

答案 1 :(得分:2)

如果这是一个Web应用程序,也许你可以"欺骗一下"通过在输入字符串之前嗅探用户的区域设置。

MSDN文章" How to: Display Localized Date and Time Information to Web Users"有用的信息。

答案 2 :(得分:1)

受到Mani的好建议的启发,我已根据自己的需求创建了以下扩展方法:

public static bool TryFormatLike(this DateTime dateTime, string another, out string result)
{
    var allCultures = CultureInfo.GetCultures(CultureTypes.AllCultures | CultureTypes.UserCustomCulture | CultureTypes.ReplacementCultures);
    foreach (var culture in allCultures)
    {
        var allPatterns = culture.DateTimeFormat.GetAllDateTimePatterns();
        foreach (var pattern in allPatterns)
        {
            DateTime parsedAnother;
            if (DateTime.TryParseExact(another, pattern, culture.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out parsedAnother))
            {
                result = dateTime.ToString(pattern);
                return true;
            }
        }
    }

    result = string.Empty;
    return false;
}

你可以这样使用它:

string formattedNow;
if (DateTime.Now.TryFormatLike("13.02.2015 16:14:43", out formattedNow))
{
    Console.WriteLine(formattedNow);
}

这将打印

10.03.2015 23:37:08

不幸的是,有些日期&所有文化中的所有模式都无法解析时间格式(例如,字符串16:14:43 13.02.2015将不会被解析)。

无论如何,谢谢你的评论&答案。也许这种方法对某人有帮助。