文件名中您最喜欢的日期和时间格式是什么?[关闭]


88

这是一个有点主观的问题,在大型方案中不是很重要,但是却经常使我烦恼。在文件名中添加时间戳似乎没有不言而喻的方法。

客观问题是文件名中的时间戳应该可排序。但是.NET可排序的日期格式(例如“ s”"yyyy-MM-ddTHH:mm:ss")和“ u”"yyyy-MM-dd HH:mm:ssZ"))在文件名中无效,因为它们带有':'字符。

另一件事是,您应该轻松查看是否使用了通用时间或本地时间。实际上,用户似乎更喜欢本地时间而不是通用时间。

我最终使用了具有基本时间格式的ISO 8601

  • 当地时间格式字符串 "yyyy-MM-ddTHHmmsszz"
  • UTC格式字符串 "yyyy-MM-ddTHHmmssZ"

在这些格式下,我当前的当地时间是"2009-08-08T151800+03"UTC"2009-08-08T121800Z"

您还可以使用“ K”自动检测DateTime.Kind并使用"yyyy-MM-ddTHHmmssK",但随后必须替换':'字符。

还有其他建议吗?

编辑:到目前为止的一些注意事项:

"yyyy-MM-ddTHHmmsszz"如果涉及多个时区,则本地时间+时区格式将不再可排序。在大多数情况下,如果有多余的信息,则可以删除时区信息,否则使用UTC。

另一件事是,UTC应始终标有“ Z”,“ GMT”或“ UTC”,以防止猜测和错误。

朱利安日期和其他星状日期很酷,因为使用公历的日期算术很容易死。


2
我同意所有这一切,除了我确实认为在大事情上很重要。您的格式是最好的-我什至会使用ISO8601中指定的4位数时区来容纳非整数时区。一直困扰我的是,ISO8601没有解决文件名中禁止的冒号。
hpekristiansen '16

我在blog.xam.de/2016/07/…中的帖子中提出了一种基于ISO 8601的格式-如果我们可以就一种格式达成一致,这将使我们的世界更加轻松:-)
MaxVölkel博士

“封闭不具有建设性”?支持和反对每个建议都有其理由,因此它具有建设性。无需回避有关文件命名的更详尽的哲学细节的问题:D
tanius

Answers:


57

我用这个:

My-File--2009-12-31--23-59-59.txt
  • 没有空间
  • 双破折号分隔各个部分,使每个部分都易于查看
  • 只有一个标点符号(破折号)使其易于输入
  • 没有时区,因为对于我来说,我一直在本地时区工作;如果我需要一个,我会选择UTC并--UTC在时间之后附加“ ”。

5
尽管我时间戳开始,然后是“我的文件”,但我所做的事情大致相同,因为这允许通过按字母顺序对文件名按时间顺序查看文件。
ChristopheD

2
@ChristopheD:当然-在这种情况下,我会做同样的事情。对于我的答案,我在考虑以下情况:您有几个不同文件的多个版本,并且希望将它们按文件名分组。
RichieHindle 2009年

2
我个人更喜欢使用下划线(_)而不是双破折号来分隔各个部分。(例如My-File_2009-12-31_23-59-59.txt
Elie G.

一个name_-_2019-11-04--15-04-36.642621403_-_2019-11-04--15-04-36.642622803.ext是OK的Linux外壳。没有时区,但具有纳秒精度。
伊万·布莱克

14

我会使用YYYY-MM-DD HHmmss文件名,除非特别需要时区或可能需要将它们解析为ISO日期。在这种情况下,最好选择ISO日期。

编辑:时区实际上不应该是必需的;将所有内容保存为UTC并让人们知道,所有UTC都比指定所有时区更有效。


9
哎呀,文件名中有空格吗?
Saggi Malachi

10
空格有什么问题?
乔伊(Joey)

41
是的,空格令人发指。我将亲自追踪那些在文件名中使用空格的人,并用一块湿的芹菜将它们打死:-)
paxdiablo,2009年

1
@Saggi; 好吧,我可能应该得到那个,但是认真地看一下-给我看一个不处理带空格文件名的系统?据我所知,它不涉及URI,因此我不必太担心空间。当然,您可以将该空间交换为其他内容,例如下划线或T,但这在阅读时不太自然。

1
我将对此投票(但我永远不会使用空格),原因是4位数字年份将推迟y2k1问题(但不是y10k问题,但谁真的为此提供了XXXX?)。
paxdiablo

8

这是我用的:

    private static string CreateMeaningfulFileName(string friendlyName, DateTime date)
    {
        StringBuilder sb = new StringBuilder();
        foreach (string s in friendlyName.Split(new char[] { ' ' }))//remove spaces
        {
            sb.Append(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()));//capitalize each segment
        }
        sb.Append("_" + date.ToString("yyyy-MM-dd_HH-mm"));//add date
        return sb.ToString();
    }

它需要一个日期和描述。让我们使用“我喜欢DOGS”。结果是:

ILikeDogs_1999-09-23_18-42


1
打破日期和时间的好方法,比@RichieHindle的答案少1个字符。
罗宾诺2014年

3

时间戳是否需要人类可读?如果没有,则可以只使用DateTime.Ticks.ToString()。非常准确,可排序且没有特殊字符。


1
如果可能的话,我倾向于尝试使所有内容可读。这是JSON表示法等方案的重要价值之一。即使您认为它不需要是人类可读的,也永远不会知道以后是否希望它是人类可读的。此外,它还易于调试。
Edan Maor 2010年

链接已断开,它去了什么?
rbatt 2015年

@rbatt我认为这只是MSDN的临时问题-应该现在回来。
Dan Diplo

2

通常我使用yyyymmdd。如果需要进一步的精度,则更改为yyyymmddhhmmss


1

我使用unix时间戳,例如。从纪元过去多少秒。所有时间均为UTC。但是,如果您愿意的话,可以在时区数据前加上前缀。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.