【问题标题】:Date Time Format String only for Milliseconds仅限毫秒的日期时间格式字符串
【发布时间】: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),不清楚这两个数字(431112323412345)的含义以及您希望如何处理它们。
  • 是的例子请。您写了很多散文,但我们实际上需要输入和预期输出的简明示例才能为您提供帮助。
  • 例如,“毫秒”只是常规日期时间值的毫秒部分(介于 0 和 1000 之间),或“自 1970 年 1 月 1 日以来的毫秒数”(或其他一些固定日期)
  • 我特别想要的是通过 TryParseExact 方法将包含许多未指定长度的字符串解析为 DateTime 对象,如果不可能,这不是问题,但我只是在寻找一个更漂亮的选项。

标签: c#


【解决方案1】:

不要期望将其直接解析为日期时间。相反,为基准日期保留一个常量 epoch DateTime 值,将文件名解析为 long,然后执行以下操作:

var FileDate = epoch.AddMilliseconds(parsedLongValue);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2017-10-11
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多