2016-09-22 41 views
1

我已經看過一堆關於將字符串解析爲DateTime對象的問題,但沒有一個像我一樣具有相同的格式。我需要解析成一個DateTime對象的字符串格式爲:使用月份名稱和AM/PM的DateTime字符串轉換

2016年6月29日下午12時57
1900年1月1日上午12點

我想要的格式如下:

DateTime.ParseExact(date, "MMM dd yyyy hh:mmtt", CultureInfo.InvariantCulture) 

但是這引發了一個FormatException。有什麼建議麼?

+0

您能澄清[自定義​​日期和時間格式字符串]的哪一部分(https://msdn.microsoft.com/en-us/library/8kb3ddd4(v = vs.110))。aspx)對日期格式不清楚(比如''d「'與''dd」'區別)? –

+0

請注意,帖子的標題與您遇到的問題完全無關 - 您可能需要重新閱讀[MCVE]關於爲帖子創建示例代碼的指導。 –

+1

檢查日期字符串中的尾部空格 – Fabio

回答

2

您可能想查看MSDN上的Custom Date and Time Format Strings頁面。我認爲你的問題是,你現在的格式需要在你的一天和兩個小時都引導零。例如,這看起來像

1900年1月1日下午1時

你可能想使用的格式

DateTime.ParseExact(date, "MMM d yyyy h:mmtt", CultureInfo.InvariantCulture) 

不需要當天的前導零和小時位置。這將1900年1月1日1:00 PM

我希望這有助於匹配等值

+0

Jan 01 1900 12:00 AM嘗試此格式仍不起作用。你的回答對我來說似乎是正確的。 – pcoonan

+0

@pcoonan它適合我。在你的文章中,你給出了兩個示例字符串,第一個字符串有一個尾部空格。除了格式問題(可以使用本答案中給出的格式解決這些問題)之外,還需要刪除需要刪除的尾部空格,因爲它們也會導致'FormatException'。可能使用['Trim()'](https://msdn.microsoft.com/en-us/library/t97s7bs3(v = vs.110).aspx)來擺脫所有前導和尾隨空格。 – Quantic

+0

對不起,我感到困惑。我提供的格式不適合使用我提供的值。該值是您在問題中提供的格式所匹配的值的示例。我的格式應該適用於1900年1月1日1:00 AM這樣的值,而不是您的原始格式,它與Jan 01 1900 01:00 AM相匹配。我提供的格式不需要前導零。你的確如此。這是唯一的區別。 –

0

第一個字符串將被成功解析。

第二個字符串需要使用d specifier而不是dd specifier,因爲單日號碼不是的前導零。

DateTime.ParseExact("Jun 29 2016 12:57PM", 
        "MMM dd yyyy hh:mmtt", 
        CultureInfo.InvariantCulture).Dump(); 

DateTime.ParseExact("Jan 1 1900 12:00AM ", 
        "MMM d yyyy hh:mmtt", 
        CultureInfo.InvariantCulture).Dump(); 

順便說一句,你可以使用MMM d yyyy hh:mmtt格式對他們倆的。

+0

您可以在兩個字符串上使用'd'。 – Quantic

+0

@Quantic是的,但可能不需要,因爲'h'和'hh'都成功地分配了'12'。 –

+0

@Downvoter至少關心評論,所以我可以看到我可能會錯在哪裏? –

-1

這裏的日期格式的備忘單,的http://www.mikesdotnetting.com/article/23/date-formatting-in-c

Example Usage 

<%= String.Format("{specifier}", DateTime.Now) %> 
@DateTime.Now.ToString("F") 
@DateTime.Now.ToString("hh:mm:ss.fff") 


Specifier 

Description 

Output 

d Short Date 08/04/2007 
D Long Date 08 April 2007 
t Short Time 21:08 
T Long Time 21:08:59 
f Full date and time 08 April 2007 21:08 
F Full date and time (long) 08 April 2007 21:08:59 
g Default date and time 08/04/2007 21:08 
G Default date and time (long) 08/04/2007 21:08:59 
M Day/Month 08 April 
r RFC1123 date Sun, 08 Apr 2007 21:08:59 GMT 
s Sortable date/time 2007-04-08T21:08:59 
u Universal time, local timezone 2007-04-08 21:08:59Z 
Y Month/Year April 2007 
dd Day 08 
ddd Short Day Name Sun 
dddd Full Day Name Sunday 
hh 2 digit hour 09 
HH 2 digit hour (24 hour) 21 
mm 2 digit minute 08 
MM Month 04 
MMM Short Month name Apr 
MMMM Month name April 
ss seconds 59 
fff milliseconds 120 
FFF milliseconds without trailing zero 12 
tt AM/PM PM 
yy 2 digit year 07 
yyyy 4 digit year 2007 
: Hours, minutes, seconds separator, e.g. {0:hh:mm:ss} 09:08:59 
/Year, month , day separator, e.g. {0:dd/MM/yyyy} 08/04/2007 
. milliseconds separator 
+2

這是什麼? o.O我們真的需要這個嗎? –

1

禮貌有其需要的格式,試圖數組,並允許您指定空格是允許的DateTime.ParseExact過載:

string[] ss = new string[] { "Jun 29 2016 6:59PM", "Jan 1 1900 12:00AM " }; 
string[] formats = new string[] { "MMM dd yyyy h:mmtt", "MMM d yyyy hh:mmtt", "MMM dd yyyy hh:mmtt", "MMM d yyyy h:mmtt" }; 

foreach (string s in ss) 
{ 
    Console.WriteLine(DateTime.ParseExact(s, formats, null, DateTimeStyles.AllowWhiteSpaces).ToString("yyyy-MM-dd HH:mm:ss")); 
} 

但是如果您的日期字符串有點疏忽,您可以使用TryParse代替:

DateTime d; 
foreach (string s in ss) 
{ 
    if (DateTime.TryParse(s, out d)) 
    { 
     Console.WriteLine(d.ToString("yyyy-MM-dd HH:mm:ss")); 
    } 
} 

您應該指定一個System.IFormatProvider。

相關問題