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

时间:2011-10-24 10:15:07

标签: c# windows filenames

我已经有过这个问题很多次了,并且刚刚使用了一种解决方法,但我想在这里可以提出更简单的选择。当我有来自DateTime.Now的字符串然后我想在文件名中使用它时我不能,因为Windows不允许字符/和:在文件名中,我必须像这样替换它们:< / p>

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

这看起来有点麻烦,有更简单的方法吗?任何建议都非常赞赏。

5 个答案:

答案 0 :(得分:55)

 DateTime.Now.ToString("dd_MM_yyyy")

答案 1 :(得分:47)

由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个十六进制数字。

答案 2 :(得分:10)

使用ToString模式:

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

答案 3 :(得分:2)

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

DateTime.Now.ToBinary()

答案 4 :(得分:2)

如果您需要更准确的日期时间,您可以使用:

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