2016-09-22 15 views
1

文字列を解析してDateTimeオブジェクトを作成することについての質問はたくさんありましたが、どれも同じフォーマットではないようです。私はDateTimeオブジェクトに解析する必要がある文字列が、この形式では、次のとおりです。月名と午前/午後の両方でDateTime文字列を変換する

2016年6月29日12:57
1900年1月1日午前12:00

私がしようとしていますフォーマットは以下のとおりです。 :

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

が、これはFormatExceptionをスローします。助言がありますか?

+0

[Custom Date and Time Format strings](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ページを参照してください。あなたの現在のフォーマットでは、1日と1時間の両方に先行ゼロが必要であるという問題があると思います。たとえば、これは1900年1月1日1時00分PM

おそらくフォーマット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それは私のためにうまく動作します。あなたのポストでは、2つのサンプル文字列を与え、最初の文字列の後ろにスペースがあります。あなたの書式設定の問題(この答えで書かれている書式を使って解決できる)に加えて、 'FormatException'も発生する可能性があるため、取り除かなければならないスペースもあります。おそらく['Trim()'](https://msdn.microsoft.com/en-us/library/t97s7bs3(v = vs.110).aspx)を使用して、先頭と末尾の空白をすべて取り除いてください。 – Quantic

+0

混乱して申し訳ありません。私が提供したフォーマットは、私が提供した値では動作しません。値は、あなたがあなたの質問に与えた形式が一致する値の例でした。私のフォーマットは1900年1月1日01:00 AMと一致するオリジナルのフォーマットとは対照的に、Jan 1 1900 1:00 AMのような値で動作するはずです。私が提供したフォーマットは先行ゼロを必要としません。あなたはそうです。それが唯一の違いです。 –

0

最初の文字列が正常に解析されます。

dd specifierの代わりにd 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'parses '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

これはなんですか?私たちは本当にこれが必要ですか? –

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を指定する必要があります。

関連する問題