2017-01-17 18 views
1

2行のコードに問題があり、期待通りに動作しません。重要なのは、DateTimeオブジェクトがstringに変換され、明示的なフォーマット指定なしにデフォルトの変換を使用してDateTimeに戻っていることです。Powershell v5の文字列から日時変換へのエラー

$timeString = [DateTime]::Now.ToString() # contains 17.01.2017 20:01:30 
$time = [DateTime]$timeString # PS blows with error 

したがって、基本的には、デフォルトの日付形式を使用して文字列を書式設定しますが、それを構文解析するために他の形式を使用しているようです。次のコード行は動作します、しかし:

$otherTime = [DateTime]"01/17/2017 20:01:30" # will get the initial date 

誰かがタイプ変換の問題について適切な文書に私を指す可能性があり、なぜこのような場合にはそれが前後にデータを変換するために、異なるフォーマットを使用するのでしょうか?

ありがとうございます。

+0

問題を再現できませんでした。最初のスクリプトブロックは正常に機能しました。 –

+2

'[string] [DateTime] :: Now'または' [DateTime] :: Now.ToString([CultureInfo] :: InvariantCulture) 'を使用してください。 – PetSerAl

答えて

2

日付の解析は、常に悪夢です。特に、あなたが「米国外」と呼ばれる世界の小さな部分に住んでいる場合:

一般的に、.NETの書式設定と解析の日付(および文字列の比較など)は、カルチャの設定によって制御されます。場合によっては、現在のカルチャ設定を使用するのがデフォルトの動作です。 Convert.ToDateTimeがその1つです。あなたはドキュメント(Convert.ToDateTime Method (String))に見てみるならば、それは言う:

値がnullでない場合、戻り値は のDateTimeFormatInfo内の書式情報を使用して値に DateTime.Parseメソッドを呼び出した結果ですオブジェクトはのために初期化されたです。 value引数には、DateTimeFormatInfoトピックで説明されているいずれかの形式の日付と時刻の表現 が含まれている必要があります。

これは、ローカライズされた日付文字列から変換される理由です。その他の場合、デフォルト動作は '不変文化'の設定を使用することです。これは通常、 '米国設定'を意味します。ほとんどのメソッドはオーバーロードされ、使用するカルチャを指定するパラメータを取ることができますが、.NETのドキュメントを少し調べる必要があります。

大まかには、エンドユーザーに表示されない場合はローカライズされた文字列を使用しないでください。メソッドの '不変の文化'変種を常に見つけようとし、それを文字列のフォーマットと解析に使用してください。それは多くの頭痛からあなたを救うでしょう。

2

あなたは暗黙のうちにConvert.ToDateTime(String)を呼び出していますが、このメソッドの有効なフォーマットはハードコードされているため、表示されません。あなたの出力の日付形式から、おそらくあなたが米国にいない可能性が高いことがわかります。これはおそらくほとんどの形式が中心です。

代わりに、Convert.ToDateTime(String, IFormatProvider)を明示的に使用して、必要なカルチャフォーマットプロバイダを指定することができます。

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo) 

私は米国のシステムを使用しているため、まだ動作するかどうかは完全にはわかりません。

また、[DateTime]::TryParse()または[DateTime]::TryParseExact()を使用して、必要な書式を明示的に指定することもできます。

+0

はい、私はフォーマットが 'dd.MM.yyyy'であり、セパレータが'ドット 'である異なる文化を使います。私はもっ​​と調査を行い、 '[System.Convert] :: ToDateTime(" 01/18/2017 ")'例外はスローされ、 '[System.Convert] :: ToDateTime(" 18.01.2017 ")' return 1月18日の有効日。ですから、少なくともConvert.ToDateTimeメソッドを呼び出すようなことはありません。多分それは不変の文化を知っている人に渡すでしょう。 – kosmakoff

+0

基本的には、私の問題は回避策ではなく、なぜ動作するのかの技術的説明です。たぶんどこかにバグを報告する必要があります:) – kosmakoff

関連する問題