2017-04-05 8 views
2

次の日付は文字列形式 "2017-04-05 05:00:00 a.m"です。今、私は次のコードでのdatetimeフォーマットにそれを変換しようとしています:DateTime.TryParseの日付はamの代わりにa.mで構成されています

var dateTime="2017-04-05 05:00:00 a.m"; 
DateTime value = DateTime.MinValue; 
DateTime.TryParse(dateTime, out value); 

しかし、私は{1/1/0001午前12:00:00}としてDTを取得alwayws午前、あなたは私に理由を教えていただけますか?その文字列をどのようにして日付に変換することができますか?

+0

がTryParseからの戻り値をチェックし、それを伝えることができそれは失敗しました。 – BugFinder

+0

いいえ、何も返されていません、それは1/1/0001 12:00:00 AMこの値 – Meena

+1

あなたは 'TryParseExact'を使用しようとしました。 –

答えて

2

あなたが持っているDateTime文字列は解析されず、デフォルト値を取得しています。理由の1つは、日付文字列のa.mです。現在のthread Cultureの設定にも依存します。 TryParseExactを使用して、DateTime文字列の形式にCulureInfoも指定できます。

DateTime.TryParseExact(dateTime, "yyyy-MM-dd hh:mm:ss 'a.m'", CultureInfo.InvariantCulture,DateTimeStyles.None, out value); 

は、あなたの代わりに私が上記の例で「A.M」で行ったようにエスケープする必要があります午前のA.Mています。

p.mとそれ以上の効果があります。ドットを空の文字列に置き換えて、a.mamに、p.mpmに、Custom Date and Time Format Stringsttをam/pmに使用することができます。 amまたはpmの間に1つのドットしかないと仮定します。

string dateTime = "2017-04-05 05:00:00 a.m"; 
dateTime = dateTime.Replace(".", ""); 
DateTime value = DateTime.MinValue; 
DateTime.TryParseExact(dateTime, "yyyy-MM-dd hh:mm:ss tt", CultureInfo.InvariantCulture,DateTimeStyles.None, out value); 

、その関連オブジェクトと一緒に、このプロパティによって返されるThread.CurrentCulture

CultureInfoオブジェクト、 の影響についての詳細を読む日付、 回、数字、通貨値のデフォルトフォーマットを決定、テキストのソート順、ケーシング の規則、および文字列の比較。 cultureの名前と識別子、 不変、中立、および特定の文化の違い、文化 の情報がスレッドとアプリケーションドメインに影響を与える方法についてCultureInfoクラスを に参照してください。スレッドのデフォルトの カルチャがどのように決定され、どのようにユーザが コンピュータのカルチャ情報を設定するかについては、 CultureInfo.CurrentCultureプロパティを参照してください。

+2

実際に 'p.m'なら何が起こりますか? –

+0

でも私は同じ疑問を持っていました – Meena

+0

@ DanielA.White、私たちはa.mとp.mをam、pmに変更して回答に記載することができます。 – Adil

0

が問題の原因です。 a.mp.mの両方を処理すると仮定すると、DateTimeの値を解析する前に.文字を取り除いてみてください。

var stringToParse = "2017-04-05 05:00:00 a.m"; 

DateTime parsedValue; 
DateTime.TryParse(stringToParse.Replace(".", string.Empty), out parsedValue); 

.文字が他の理由で、文字列内の他の場所で使用されている場合、これは動作しません。分数秒など。その場合は、代わりにJoe's answerを使用する方がよいでしょう。

+0

これは問題です... –

+0

@ DanielA.Whiteこんにちはダニエル、私はあなたが他の多くの答えに同様のコメントを与えているのを見ます。あなたは_why_で展開できますか?もっと役立つだろう。 –

+0

あなたはそのような文字列を置き換えることに頼るべきではありません。 –

10
カスタム午前/午後の指定子とカスタム DateTimeFormatInfoを作成してみてください

:これはまた、午後の時間のために働く

var formatInfo = (DateTimeFormatInfo) CultureInfo.InvariantCulture.DateTimeFormat.Clone(); 
formatInfo.AMDesignator = "a.m"; 
formatInfo.PMDesignator = "p.m"; 

var value = DateTime.Parse("2017-04-05 05:00:00 a.m", formatInfo); 

var value = DateTime.Parse("2017-04-05 03:00:00 p.m", formatInfo); 
+0

これはもっと似ています... –

+0

@Joeこれはうまくいきます。可能であれば答えを教えてください – Meena

+0

@Meena - 文字列を解析すると、DateTime.Parseと関連するメソッドは、 DateTimeFormatInfo'が解析に使用されています。デフォルトでは、これはThread.CurrentCultureから取得され、英語の文化では文字列 "AM"と "PM"が使用されます。あなたの文字列には "a.m"と "p.m"が含まれています。これは私が知る限り、既知のカルチャと一致しませんが、あなたのカスタムam/pm指定子に示すように、カスタムの 'DateTimeFormatInfo'を作成できます。 – Joe

関連する問題