使用另一个字符串作为模板将日期时间转换为字符串
本文关键字:字符串 日期 时间 转换 另一个 | 更新日期: 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
不会被解析)。
无论如何,感谢您的评论和回答。也许这种方法对某人有帮助。