【发布时间】:2016-10-23 11:05:48
【问题描述】:
我目前正在编写一段代码,我需要根据一年中的当前周命名一个文件夹(根据 ISO8601 标准)。
文件夹将被命名为:“y[year]w[week-of-year]”。例如,本周的文件夹名称可能是“y2016w42”。
我目前正在做以下事情:
DateTime n = DateTime.Now;
string folderName = "y" + n.Year + "w" + DataHelper.WeekOfYearISO8601(n);
我首先将当前时间分配给变量 n,然后使用它来生成文件夹名称。
现在我实际上宁愿做以下事情:
string folderName = "y" + DateTime.Now.Year + "w" + DataHelper.WeekOfYearISO8601(DateTime.Now);
DateTime.Now 是否计算一次或两次实际时间?编译器是从第一次评估中重新使用它,还是在这种情况下我实际上得到了两个不同的时间戳?
我确信这段代码在 99.9999% 的时间里都能正常工作,但是如果这段代码在新年之夜午夜运行会发生什么? (让我们忽略这一事实,即根据 ISO8601 标准,一年中的一周在 NYE 上不一定会发生变化,并假装它们今年是一致的)。
如果 DateTime.Now 被评估两次,我可以想象其中一个 DateTimes 仍在 2016 年第 52 周,另一个在 2017 年第 1 周。这可能会带来麻烦,因为文件夹可能会被命名为“ 2017_52" 或 "2016_1",两者都是错误的 - 正确的是 "2017_1" 或 "2016_52"。
我确定我提供的第一个 sn-p 代码没问题,但第二个 sn-p 是否也适用于所有场景?
【问题讨论】:
-
为什么更喜欢第二个版本? (恕我直言,第一个版本更具可读性,因此更容易理解)
-
string folderName = "y%sw%s" % (n.Year, DataHelper.WeekOfYearISO8601(n))将是我的首选方式:字符串连接很慢,因为字符串在 Python 中是不可变的。填充格式字符串更快。 -
@dexter:我认为“DateTime.Now”和“n”一样难以理解,因此额外的变量似乎是不必要的,特别是因为我发现自己经常使用 DateTime。
-
@TemporalWolf:问题是 C#,但是你是对的,String.Format 会更好。