DateTime.ToString 格式化并将结果字符串反转回日期时间

Posted

技术标签:

【中文标题】DateTime.ToString 格式化并将结果字符串反转回日期时间【英文标题】:DateTime.ToString formatting and reversing the resulting string back to the datetime 【发布时间】:2015-11-19 16:01:09 【问题描述】:

我有一个系统,其中在每行开头使用当前日期时间生成日志文件。

例如。

LogUtil.Logger(DateTime.ToString("yyyy/MM/dd") + "|" + "My Message Here");

根据文化,此日志文件可能会导致年、月和日之间的分隔符不同。

例如。

2015/11/19  or  2015.11.19

我正在编写一个单独的实用程序,该实用程序获取此生成的日志文件并对其进行解析,并将其他信息发送给第 3 方。

由于日期格式不同,我怎样才能让它每次都正确解析。

目前我正在使用:

DateTime.TryParseExact(line.Substring(0, 10), "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out Date);

此格式说明符仅正确格式化2015/11/19

【问题讨论】:

@JamieR 如何使用相同的代码解析日志。如果日期是 2015.11.19 则失败并且仅适用于 2015/11/19 如果第一次解析失败,尝试用其他格式解析 Parse datetime in multiple formats的可能重复 您可以分别解析年、月和日,然后从中创建一个DateTime 【参考方案1】:

您可以将多种格式传递给DateTime.TryParseExact。使用overload。

DateTime.TryParseExact(line.Substring(0, 10), 
                    new[] "yyyy/MM/dd", "yyyy.MM.dd", 
                    CultureInfo.InvariantCulture, 
                    DateTimeStyles.None, 
                    out Date);

这应该适用于两种格式:2015/11/19 or 2015.11.19

【讨论】:

如果随机客户先生决定进入他的区域设置并更改他的日期格式以使用 * 而不是 .或 / @CathalMF:问题的根源在于您让用户的设置影响日志文件的格式。在你解决这个问题之前,任何解析日志文件的方法都是脆弱的。 @CathalMF,您无法针对所有可能的选项进行编程,您可以通过 DateTimeFormatInfo.DateSeparator 属性请求 Separator 属性,查看输入字符串中是否存在该属性,将其替换为通常的从您的格式中进行解析。但最好的选择是使用单一格式,通常应用程序日志是给你的,而不是给用户的。【参考方案2】:

如果您能分辨出用于生成给定日志文件的文化,请使用该文化而不是 InvariantCulture。

var culture = CultureInfo.GetCultureInfoByIetfLanguageTag("tr-TR"); // e.g.
DateTime.TryParseExact(line.Substring(0, 10), 
                "yyyy/MM/dd", 
                culture, 
                DateTimeStyles.None, 
                out Date);

为防止将来出现问题,我强烈建议您首先使用不变的文化生成日志文件输出。

【讨论】:

以上是关于DateTime.ToString 格式化并将结果字符串反转回日期时间的主要内容,如果未能解决你的问题,请参考以下文章

C# DateTime.ToString()的各种日期格式

使用 DateTime.ToString() 时获取日期后缀

用DateTime.ToString(string format)输出不同格式的日期

难倒 C# DateTime ToString() 格式问题

C# DateTime ToString 标准文化格式

DateTime格式转换部分介绍