2014-02-27 29 views
0

我希望我的字符串YearMonthDayHourMinuteSecondMillisecond是這種格式( 「0」 前綴在必要時):什麼是較少的Kludgy方式來有條件地在日期時間元素上加一個「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」(而不是 「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倍。

什麼是更高尚的方式來實現這一目標?

+2

我覺得變量名'YearMonthDayHourMinuteSecondMillisecond'獨自已經比菸頭的袋子醜陋「的9倍。 「 –

+0

也許8.3左右,但絕對不是9! –

回答

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

+0

是的,你抓住了我 - 我想毫秒,但剝奪了一些示例代碼*試圖簡化它,因爲我認爲它是野田時間來表明這一點。 –

+0

@ B.ClayShannon:很明顯,我不會阻止你使用Noda Time :)(你可以在Noda Time中使用完全相同的代碼,儘管我鼓勵你使用'... Pattern'代替) –

+0

每次當我聽到歌曲「Tulsa Time」時,都會發生這種情況: myBrain.Replace(「Tulsa」,「Noda」); –

1

您需要使用字符串格式,如:STR的

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

值:02

D2部分講述了格式化,以確保有在格式化數字至少兩位數。 See this MSDN page for more on Custom Numeric Format Strings

但提供日期時間格式爲DateTime.ToString是一個更好的解決方案,然後試圖從各個部分組成您想要的格式。

+0

這仍然是格式化整個日期時間的方式,儘管... –

1
string YearMonthDayHourMinuteSecondMillisecond = dt.ToString("yyyyMMddHHmmss") 
+0

是的,但是海報的示例代碼也是如此,真正的變量名稱應該更正:) – thudbutt

+0

是的,剛纔注意到了。已編輯我的答案給這兩種形式,並評論說,變量名稱不匹配的樣本... –

1

你可以使用toString()方法與格式參數,如dt.Month.ToString(「D2」)

相關問題