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

C# 使用另一个字符串作为模板将DateTime转换为字符串,c#,.net,datetime,C#,.net,Datetime,我有一个字符串,其中包含某种格式的日期和时间。例如: 13:53:56 20.08.2014 这个字符串是从用户上传到我的服务的文件中解析出来的。确切的日期和时间格式未知。它可以更改为您知道的几乎任何日期和时间格式。我没有一个预期格式或类似的列表 我想开发一种算法,以某种方式从初始字符串中提取格式,并将其应用于,例如,DateTime.Now。 有什么简单而优雅的方法可以做到这一点吗?如果您知道预期格式的列表,那么请定义它们并使用DateTime.TryParseExact()查找输入字符串的

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

13:53:56 20.08.2014
这个字符串是从用户上传到我的服务的文件中解析出来的。确切的日期和时间格式未知。它可以更改为您知道的几乎任何日期和时间格式。我没有一个预期格式或类似的列表

我想开发一种算法,以某种方式从初始字符串中提取格式,并将其应用于,例如,
DateTime.Now

有什么简单而优雅的方法可以做到这一点吗?

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

一起使用即可。如果您知道所需格式的列表,请定义它们并使用
DateTime.TryParseExact()
查找输入字符串的匹配格式。一旦你有了匹配的格式,你就可以简单地将匹配的格式与
DateTime.Now.ToString(format)
一起使用。如果这是一个web应用程序,也许你可以在用户输入字符串之前嗅探用户的区域设置来“欺骗一点”


MSDN文章“”提供了有用的信息。

如果这是一个web应用程序,也许您可以通过在用户输入字符串之前嗅探用户的区域设置来“欺骗一点”


MSDN文章“”提供了有用的信息。

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


无论如何,谢谢你的评论和回答。也许这个方法会对某人有所帮助。

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


无论如何,谢谢你的评论和回答。也许这个方法对某些人会有帮助。

是你的朋友。你是想弄清楚字符串的格式,然后将相同的规则应用到不同的
日期时间
?@ryanyyu。对我把我的问题改得更准确了你说格式可以改变有多少种格式?对于日期,您需要精确,因为交换月份和日期可能会改变很多日期。日期时间字符串从何而来?本地工作站?网络服务?请提供更多详细信息,因为可能会有更好的答案。这里有一个简单的建议,上传文件的用户还可以上传其日期和时间的区域设置,您可以使用此信息解析文件中的日期和时间。是您的朋友。您是否正在尝试找出字符串格式,然后将相同的规则应用于不同的
日期时间
?@ryanyuyu。对我把我的问题改得更准确了你说格式可以改变有多少种格式?对于日期,您需要精确,因为交换月份和日期可能会改变很多日期。日期时间字符串从何而来?本地工作站?网络服务?请提供更多详细信息,因为可能会有更好的答案。这里有一个简单的建议,上传文件的用户也可以上传其日期和时间的区域设置,您可以使用此信息从文件中解析日期时间。“如果您知道预期格式的列表”-这就是诀窍,我不知道预期格式的列表。很抱歉,如果这没有帮助,但您需要找到一种从输入字符串中识别格式的方法,否则您不知道53:56是mm:ss还是ss:mm:)。您试图解决的问题类似于从匹配字符串创建regex模式,我们知道这是不可能的。“如果您知道预期格式的列表”-这是诀窍,我不知道预期格式的列表。抱歉,如果这没有帮助,但您需要找到从输入字符串识别格式的方法,另一方面,你不知道53:56是mm:ss还是ss:mm:)。您试图解决的问题类似于从匹配字符串创建正则表达式模式,我们知道这是不可能的。