Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DateTime.Now转换为有效的Windows文件名_C#_Windows_Filenames - Fatal编程技术网

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

C# 将DateTime.Now转换为有效的Windows文件名,c#,windows,filenames,C#,Windows,Filenames,我曾经多次遇到过这个问题,并且刚刚使用了一个解决方法,但我想我会在这里询问,以防有一个更简单的选择。当我有一个来自DateTime.Now的字符串时,我想在文件名中使用它,但我不能,因为Windows不允许在文件名中使用字符/and:,我必须这样替换它们: string filename = DateTime.Now.ToString().Replace('/', '_').Replace(':', '_'); var saveZipToFile = "output_" + DateTime.

我曾经多次遇到过这个问题,并且刚刚使用了一个解决方法,但我想我会在这里询问,以防有一个更简单的选择。当我有一个来自
DateTime.Now
的字符串时,我想在文件名中使用它,但我不能,因为Windows不允许在文件名中使用字符/and:,我必须这样替换它们:

string filename = DateTime.Now.ToString().Replace('/', '_').Replace(':', '_');
var saveZipToFile = "output_" + DateTime.Now.ToFileName() + ".zip";

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

使用ToString模式:

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

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

DateTime.Now.ToBinary()

正如萨米奇所写,但是

// The following will produce 2011-10-24-13-10
DateTime.Now.ToString("yyyy-MM-dd-HH-mm", CultureInfo.InvariantCulture);
如果您不信任我,请尝试将区域设置为
newcultureinfo(“ar sa”):-)

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

DateTime.Now.Ticks.ToString("D19");
DateTime.MaxValue.Ticks中有19位数字

如果你更恨这个世界:

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

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

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

DateTime.Now.ToString("O").Replace(":", "_") //2016-09-21T13_14_01.3624587+02_00
或者(如果你需要少一点)

两者都是有效的文件名,并且可以排序

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

public static string ToFileName(this DateTime @this)
{
    return @this.ToString("O").Replace(":", "_");
}
然后像这样使用它:

string filename = DateTime.Now.ToString().Replace('/', '_').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

  • “O”格式符合ISO 8601
  • “s”格式为

您能使用更符合逻辑的iso8601样式模式吗,如
yyyyMMdd
?哇,我不知道DateTime有这么多细节,+1,谢谢@BaliC我要补充一点,如果您正在“运动”使用
DateTime
对文件进行编号,您可能应该使用
DateTime.UtcNow
,这样您就不会在DST更改时间方面遇到问题。请注意大写的MM是月,而不是MM是分钟。。非常重要!这假定该语言在dd、MM或yyyy格式中不使用非法的文件名字符。英语也是如此。其他语言未必如此。@RoyiNamir谢谢,我刚刚试过使用它,遇到了这个问题,所以回来看看你的答案,谢谢!你必须用HH代替HH,否则你会得到02