String.Format yyyy/MM/dd? 誤會大了 - 黑暗執行緒
文章推薦指數: 80 %
換句話說,如果日期格式被設定為yyyy-MM-dd,則DateTimeFormatInfo.DataSeparator = "-",此時string.Format("{0:yyyy/MM/dd}", DateTime.
今天才發現一件誤很大的事...Console.WriteLine(string.Format("{0:yyyy/MM/dd}",DateTime.Today));結果應該是什麼?不就是2009/04/01嗎?答案是不一定,也有可能是2009-04-01哦!根據本草綱目MSDNLibrary記載,日期格式裡的"/"代表的並不是斜線符號,而是DateTimeFormatInfo.DataSeparator。
RepresentsthedateseparatordefinedinthecurrentDateTimeFormatInfo.DateSeparatorproperty.Thisseparatorisusedtodifferentiateyears,months,anddays.表示目前DateTimeFormatInfo.DateSeparator屬性中所定義的日期分隔符號。
此分隔符號可用來分隔年、月和日。
換句話說,如果日期格式被設定為yyyy-MM-dd,則DateTimeFormatInfo.DataSeparator="-",此時string.Format("{0:yyyy/MM/dd}",DateTime.Today)就會變成2009-04-01,而不是想像中的2009/04/01。
要如何解決?請愛用Escape字符"\",寫成以下的格式就OK了。
Console.WriteLine(string.Format("{0:yyyy\\/MM\\/dd}",DateTime.Today));ShareonFacebookShareonTwitterShareonGoogle+EmailComments#2009-04-0110:00AMbyeric又更加的佩服Jeffrey,有如滔滔江水.........
我們的程式之前RUN在簡體OS的環境,日期格式有時會莫明奇妙的變成-,一直都不求甚解,今天看了Jeffrey才知道....原來一直誤很大啊~~~#2009-04-0111:53AMbyhuang47這是4/1騙人的嗎@_@#2009-04-0112:32PMbyJason不是很了解.
我認為,若使用DateTimeFormatInfo.DateSeparator處理,則表示想利用System.Globalization中的CultureInfo和DateTimeFormatInfo內的資訊,來為你自動處理日期格式問題;而例子中,您用的是自訂格式來指定輸出日期格式.
我認為,假若您用的是自行指定日期輸出格式,根本不需要考慮"/"or"-",愛用哪一個,Console.WriteLine時或反向把字串轉回DateTime時,都不會發生錯誤.反之,您若也都利用CultureInfo中的定義,讓.NET自行去轉換,也都不會發生問題.
問題是出在您把兩者混用.其實這令我非常不解且沒有必要.
#2009-04-0105:45PMbyJeffreytoJason,我們還蠻常遇到二者混用的情境,最常見的狀況便是DateTime.ToString()與DateTime.ParseExact()不是在發生在同一台機器上。
例如:機器A用"/",將日期傳成字串傳給機器B,而機器B由User管理,分隔符號用"-",要將字串轉回日期就要留意。
還有一種更常見的情況是Client端由Server端收到日期字串(有可能Server歸第三者管理,日期格式由不得我們決定),要轉型回DateTime,如果純粹只是字串轉日期,有另一種做法是指定Culture,例如:DateTime.ParseExact("2009/04/01","yyyy/MM/dd",System.Globalization.CultureInfo.InvariantCulture),這樣也可以避開User自訂日期格式的干擾。
#2009-04-0106:16PMbytomexou我的系統習慣使用yyyy-MM-dd,因此平時有注意到這現象,也大概知道原因,不過倒沒細查該如何解決。
感謝jeffery提供solution。
#2009-04-0201:29AMbyJason剛好藉這機會仔細去翻了翻本草綱目.確實發現了些以前沒注意到的東西,我認為我應該有找到更深一層的原因.當然,您的解法確實是一條可行的路,某些狀況下,我應該也會採用,不過我還是想提出一些我不一樣的想法.
首先先說一下這狀況發生的精確原因:根據此
http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.dateseparator.aspx
URL的Remark部分描述.(其實我是反覆實驗中先發現當自訂的格式字串中含有'/'時,才會發生您所說的現象,之後才去找到此說明)
我實驗出來的結果得到的推論是(VS.NET2008+Vista英文版):
1.自訂日期格式中若含有'/',當日期輸出為字串時,會被DateTimeFormatInfo.DateSeparator取代;反之若自定格式使用"yyyy-MM-dd",而DateSeparator為"/",則不會被取代.
2.而甚麼字元是DateSeparator,則由RegionOption中的ShortDateFormat的分格字元所決定.(當然我發現似乎只有{'/','-','.'}三個字元可以做為分格字元,試了好幾種"#$%!"都沒法apply)
至於我原本說的"混用"這定義似乎也模糊,當然我原本也誤解您的意思,在此抱歉.所以也就不再繼續在這兩字上做文章.
另外想提供個我覺得ok的方法,雖然多寫點東西,不過這類格式轉換,通常該在utilityfunction中定義,所以覺得該是還算可接受的:(以下code,包含了我上述的#1,#2的實驗,以及我覺得另一可行的做法.)
DateTimeFormatInfofmt=(newCultureInfo("zh-TW")).DateTimeFormat;
fmt.DateSeparator="$";
fmt.ShortDatePattern="yyyy-MM-dd";
Console.WriteLine(dt.ToString("d",fmt));
fmt.ShortDatePattern="yyyy/MM/dd";
Console.WriteLine(dt.ToString("d",fmt));
Console.WriteLine(string.Format(fmt,"{0:yyyy-MM-dd}",dt));
Console.WriteLine(string.Format(fmt,"{0:yyyy/MM/dd}",dt));
#2009-04-0202:33AMbykikkoma我慣用的方式是DateTime.ToString("yyyy/MM/dd");
所以一直以來都認為這是理所當然的
還沒用過string.Format來格式化日期物件呢
感謝提醒囉~#2009-04-0611:40PMbyT@T指定DateTimeFormatInfo.InvariantInfo為Format的IFormatProvider即可實現你format的指定的時間格式
不論在哪個國家都一樣,
相關可以查下MSDN#2011-04-1611:30AMbyKK最近將電腦時間改成yyyy-MM-dd的格式
在程式中寫DateTime.Now.ToString("yyyy/MM/dd")
出來確是yyyy-MM-dd的時間,而不是yyyy/MM/dd
原來如此是這樣
感謝,又學到一課。
#2011-05-1404:58PMbyKalinJeffrey,
"yyyy\\/MM\\/dd"用於string.Format("{0:yyyy\\/MM\\/dd}",DateTime.Today)下確實可以產出yyyy/MM/dd的格式
可是改用DateTime.ToString("yyyy\\/MM\\/dd")反而會出現"2010\\/06\\/14"這種怪結果..
PostacommentCommentNameCaptcha51-39=黑暗執行緒黑暗後花園OrcsWeb:WindowsServerHosting2011-05-14KalinString.Formatyyyy/MM/dd?誤會大了Jeffrey,
"yyyy\\/MM\\/dd"用於string.Format("{0:yy...2011-04-16KKString.Formatyyyy/MM/dd?誤會大了最近將電腦時間改成yyyy-MM-dd的格式
在程式中寫[email protected]/MM/dd?誤會大了指定DateTimeFormatInfo.InvariantInfo為Format的IFormat...2009-04-02kikkomaString.Formatyyyy/MM/dd?誤會大了我慣用的方式是DateTime.ToString("yyyy/MM/dd");
所以一直以來...2009-04-02JasonString.Formatyyyy/MM/dd?誤會大了剛好藉這機會仔細去翻了翻本草綱目.確實發現了些以前沒注意到的東西,我認為我應該有找到更深一層的...2009-04-01tomexouString.Formatyyyy/MM/dd?誤會大了我的系統習慣使用yyyy-MM-dd,因此平時有注意到這現象,也大概知道原因,不過倒沒細查該如何解決...2009-04-01JeffreyString.Formatyyyy/MM/dd?誤會大了toJason,我們還蠻常遇到二者混用的情境,最常見的狀況便是DateTime.ToString...2009-04-01JasonString.Formatyyyy/MM/dd?誤會大了不是很了解.
我認為,若使用DateTimeFormatInfo.DateSeparator...2009-04-01huang47String.Formatyyyy/MM/dd?誤會大了這是4/1騙人的嗎@[email protected]/MM/dd?誤會大了又更加的佩服Jeffrey,有如滔滔江水.........
我們的程式之前RUN在簡體OS的環境...
延伸文章資訊
- 1DateTimeFormatInfo.GetAllDateTimePatterns 方法 - Microsoft ...
DateTimeFormat.GetAllDateTimePatterns()) { total += 1; if (! DateTime. ... M.yy H.mm') // Unable ...
- 2String.Format yyyy/MM/dd? 誤會大了 - 黑暗執行緒
換句話說,如果日期格式被設定為yyyy-MM-dd,則DateTimeFormatInfo.DataSeparator = "-",此時string.Format("{0:yyyy/MM/dd}...
- 3C# DateTime Format:Working with Date &Time format in C#|
You can convert the dateTime to any DateTime format by simply adding the required format in ToStr...
- 4時間格式及方法運用| skyline0217 - 點部落
ToString("yyyy/MM/dd HH:mm:ss") 2008/09/23 13:03:03 DateTime.Now. ... C# 格式化時間字串 ... Format("{0:f...
- 5發問
Format("{0:yyyy/MM/dd HH:MM:ss}",時間) ... 如何把2012/2/9 下午01:39:11用string.format改成2012/02/09 13:39:1...