【发布时间】:2022-11-23 05:14:57
【问题描述】:
对于一个项目,我从文件名中解析时间戳,每个时间戳都有自己的格式。我从合作伙伴公司获得文件,因此文件的命名是不可协商的。现在的问题是,除了一个,每个文件名都有一个很好的时间格式,可以很容易地转换为 c# 日期时间格式字符串,以便解析为 DateTime 对象。不同的是,严格使用自初始化以来的毫秒数,因为它的时间戳类似于
+4311123234_12345 M.txt 下划线后面的数字表示毫秒。
在此示例中,毫秒将是 12345,但文件名也可以是 +4311123234_123423402345802345 M.txt,其中 123423402345802345 表示毫秒。对我来说只有毫秒部分是相关的并且是从文件名中提取的。我现在想要一个字符串,例如“yyyy”(通常为年份),然后通过 TryParseExact 方法将此数字解析为 DateTime 对象。从何时开始计算毫秒数并不重要,因为它仅用于排序,所以就我而言,它们可以是自 01.01.1900 00:00:00 以来经过的毫秒数。
我进行了谷歌搜索,但得出的结论是,这样的日期时间格式字符串并不存在。我知道有 ss.fffff 但由于我不知道毫秒时间戳有多少位数,我将不得不生成一个单独的格式字符串,其中包含相应的 'f' 数。这也是没有选择的,因为格式字符串应该是用户输入的。
现在我将它与一个特殊的关键字耦合,这样当输入是 keyword 时,时间将不会被时间格式字符串解析,而只会被我将文件名中的部分解析为 long 的毫秒数解析。
它工作正常,但在我看来它真的不理想......
我忘了说的是,包含时间戳的字符串是通过 Regex CaptureGroups 从文件名中提取的,因此在代码示例中,时间戳字符串位于 cc[0]
private static void CheckForValidMatch(SortedList<DateTime, string> files, string file, Match match,string dateTimeFormat,int groupNumber)
{
Group group = match.Groups[groupNumber];
CaptureCollection cc = group.Captures;
DateTime dateTime;
if (cc.Count == 0)
Debug.WriteLine("group did not capture anything");
else
{
if (dateTimeFormat.Equals("keyword"))
{
if (long.TryParse(cc[0].ToString(),out var result))
{
dateTime = new DateTime(result);
files.Add(dateTime, file);
}
return;
}
if (!DateTime.TryParseExact(cc[0].ToString(),dateTimeFormat,DateTimeFormatInfo.CurrentInfo,DateTimeStyles.AssumeLocal, out dateTime))
Debug.WriteLine("parsing the date time failed");
else
{
files.Add(dateTime, file);
}
}
}
有没有办法让它更优雅,或者有人只知道几毫秒的格式字符串? 提前致谢!
【问题讨论】:
-
请edit问题给出这些文件名和预期结果的一些示例。对于问题中显示的一个输入(即
+4311123234_12345 M.txt),不清楚这两个数字(4311123234和12345)的含义以及您希望如何处理它们。 -
是的例子请。您写了很多散文,但我们实际上需要输入和预期输出的简明示例才能为您提供帮助。
-
例如,“毫秒”只是常规日期时间值的毫秒部分(介于 0 和 1000 之间),或“自 1970 年 1 月 1 日以来的毫秒数”(或其他一些固定日期)
-
我特别想要的是通过
TryParseExact方法将包含许多未指定长度的字符串解析为DateTime对象,如果不可能,这不是问题,但我只是在寻找一个更漂亮的选项。
标签: c#