将DateTime.Now转换为有效的Windows文件名

43

我遇到过这个问题很多次,一直在使用一个解决方法,但想问一下这里是否有更简单的选择。当我从 DateTime.Now 得到一个字符串,然后想在文件名中使用它时,由于 Windows 不允许在文件名中使用字符 / 和 : ,我必须去替换它们,像这样:

string filename = DateTime.Now.ToString().Replace('/', '_').Replace(':', '_');

这似乎有点麻烦,有没有更简便的方法?非常感谢您的任何建议。


你能使用更符合逻辑的iso8601风格模式,如yyyyMMdd吗? - tenfour
5个回答

59
 DateTime.Now.ToString("dd_MM_yyyy")

6
请注意大写的 MM 表示月份,而小写的 mm 表示分钟。非常重要! - Royi Namir
1
这假设该语言在其dd、MM或yyyy格式中不使用非法的文件名字符。对于英语是正确的,但不一定适用于其他语言。 - Raymond Chen
@RoyiNamir 谢谢,我刚刚尝试使用它并遇到了问题,所以回来看你的答案,谢谢! - Bali C

53

按照Samich的写法,但是

// The following will produce 2011-10-24-13-10
DateTime.Now.ToString("yyyy-MM-dd-HH-mm", CultureInfo.InvariantCulture);

如果你不相信我,请尝试将文化设置为 new CultureInfo("ar-sa"); :-)

我要补充一点的是,如果你讨厌这个世界,这是最准确的做法:

DateTime.Now.Ticks.ToString("D19");

DateTime.MaxValue.Ticks中包含19个数字。

如果你非常讨厌这个世界:

DateTime.Now.Ticks.ToString("X16");

DateTime.MaxValue.Ticks中有16个十六进制数字。


哇,我不知道DateTime有这么多细节,+1,谢谢! - Bali C
4
如果你使用 DateTime 来给文件编号,那么建议使用 DateTime.UtcNow 来避免在夏令时切换时出现问题。 - xanatos

11

使用ToString模式:

DateTime.Now.ToString("yyyy-MM-dd-HH-mm") // will produce 2011-10-24-13-10

3
你需要使用“HH”而不是“hh”,或者使用“02”代替“14”。 - xanatos

3
如果您需要更精确的日期时间,可以使用以下方式:
DateTime.Now.ToString("O").Replace(":", "_") //2016-09-21T13_14_01.3624587+02_00

或者(如果你需要少一点)

DateTime.Now.ToString("s").Replace(":", "_") //2016-09-21T13_16_11

这两个文件名都是有效的,可以进行排序。

您可以创建一个扩展方法:

public static string ToFileName(this DateTime @this)
{
    return @this.ToString("O").Replace(":", "_");
}

然后像这样使用它:
var saveZipToFile = "output_" + DateTime.Now.ToFileName() + ".zip";

"s"格式不考虑时区,因此以下日期时间:
  • 2014-11-15T18:32:17+00:00
  • 2014-11-15T18:32:17+08:00
使用"s"格式化后是相同的。
因此,如果您的日期时间表示不同的时区,建议使用"O"或使用DateTime.UtcNow

2

您可以使用时间戳的长格式:

DateTime.Now.ToBinary()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接