使用另一个字符串作为模板将日期时间转换为字符串

本文关键字:字符串 日期 时间 转换 另一个 | 更新日期: 2024-11-10 05:25:48

我有一个字符串,其中包含某种格式的日期和时间。例如:

13:53:56 20.08.2014

此字符串是从用户上传到我的服务的文件解析的。确切的日期和时间格式尚不清楚。它可以更改为您知道的几乎任何日期和时间格式。我没有列出预期的格式或类似的东西。

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

使用另一个字符串作为模板将日期时间转换为字符串

如果您知道预期格式的列表,请定义它们并使用DateTime.TryParseExact()找出输入字符串的匹配格式。获得匹配格式后,您可以简单地将匹配格式与 DateTime.Now.ToString(format) 一起使用。

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

MSDN 文章"如何:向 Web 用户显示本地化的日期和时间信息"提供了有用的信息。

受到 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不会被解析)。

无论如何,感谢您的评论和回答。也许这种方法对某人有帮助。