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