什么是有条不紊地将“0”添加到dateTime元素的Kludgy方式?

时间:2014-02-27 22:34:36

标签: c# datetime padding date-formatting prepend

我希望我的字符串YearMonthDayHourMinuteSecondMillisecond具有这种格式(必要时预先添加“0”):

20140227142807

......但是这个:

string YearMonthDayHourMinuteSecond = string.Format("{0}{1}{2}_{3}{4}{5}", dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);

...给我2月份的“2”(而不是“02”)等,例如:

2014227142807

我可以这样解决:

string YearMonthDayHourMinuteSecondMillisecond = string.Format("{0}{1}{2}_{3}{4}{5}{6}", dt.Year, ConditionalZeroForepad(dt.Month), ConditionalZeroForepad(dt.Day), ConditionalZeroForepad(dt.Hour), ConditionalZeroForepad(dt.Minute), ConditionalZeroForepad(dt.Second);

private string ConditionalZeroForepad(string s)
{
   if (s.Length < 2)
   {
       return string.Format("0{1}", s);   
   }
}

......但这比一袋巴茨还要快9倍。

什么是更优雅的方式来实现这一目标?

4 个答案:

答案 0 :(得分:4)

根本不要使用string.Format - 使用DateTime.ToString()

string text = dt.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture);

或者直到秒:

string text = dt.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture);

(您的变量名称表示您需要毫秒,但您的样本建议您不要。)

请注意使用CultureInfo.InvariantCulture确保始终使用公历,即使该帖子的当前文化是具有不同默认日历的文化。 (显然,如果你想要一个不同的日历,这是另一回事。)

有关详细信息,请参阅custom date and time format strings

答案 1 :(得分:1)

您需要使用以下字符串格式:

var str = string.Format("{0:D2}", 2);

str的值:02

D2部分告诉格式化程序确保格式化数字中至少有两位数字。 See this MSDN page for more on Custom Numeric Format Strings

但是,为DateTime.ToString提供日期时间格式是一种更好的解决方案,然后尝试从各个部分组合您想要的格式。

答案 2 :(得分:1)

string YearMonthDayHourMinuteSecondMillisecond = dt.ToString("yyyyMMddHHmmss")

答案 3 :(得分:1)

你可以使用带有格式参数的ToString(),例如dt.Month.ToString(“D2”)