2017-05-20 5 views
0

私はその内容に関する情報を格納するオブジェクトを持っています。日付を任意の区切り文字で区切ります

var columnType = new ColumnType 
    { 
     ColumnName = "DateTime D/M/Y", 
     ColType = typeof (DateTime), 
     Format = "ddMMyyyy HH:mm" 
    } 

これに基づいて、この列に追加する前に行を解析する必要があります。問題は、私の書式に区切り文字が含まれていないことです。私はどのような区切りに関係なく日付を解析したい。

標準DateTime.Parseにはフォーマットのコンストラクタがありません。DateTime.ParseExactには、指定されたフォーマットにすでにセパレータが含まれていることが必要です。

私はそのような日付解析します何か必要があります。そして、私のフォーマットはddMMyyyy HH:mmある場合 を:

05.03.2016 04:19 - >解析された(時間必要があります - >

05/03/2016を解析された - >

05-03-2016 04:19を解析されましたオプション)

2016/03/05 04:19 - >エラー

私はこれを実行しようとしましたが、formatにおけるセパレータなしでは動作しませんでした。このような

var format = "ddMMyyyy HH:mm"; 
DateTime.TryParseExact("05.03.2016 04:19", format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime resultValue); 
+1

「とDateTime.ParseExactは、指定された形式は、すでにそれにセパレータを持っていることを期待する」 - それは真実ではありません。曖昧でないときは、セパレータなしで解析するのは良いことです。例: 'var date = DateTime.ParseExact(" 19061976 08:10 "、" ddMMyyyy HH:mm "、CultureInfo.InvariantCulture);' –

+0

フォーマットに区切り文字が含まれていない場合、なぜあなたは値を解析しようとしていますか? *セパレータはありますか? "05.03.2016 04:19"は "ddMMyyyy HH:mm"の形式と一致しません。達成しようとしていることがわかりません... –

+0

基本的にセパレータを無視している場合でも、 "05/03/2016"をどのように解析するかは不明です。セパレータを削除した後それでも "ddMMyyyy HH:mm"と一致しない "05032016"。 –

答えて

0

何かがあなたのために働くことがあります。この最初のスニペットはオプションの時間を扱っていません。以下を参照してください。

char[] separators = { '/', '-', '.', '@', '#' }; 
string format = "dd?MM?yyyy HH:mm"; // ? replaced with each separator 
// Create and populate an array of all acceptable formats 
string[] formats = new string[separators.Length]; 
for (int i = 0; i < separators.Length; i++) 
{ 
    formats[i] = format.Replace('?', separators[i]); 
} 
DateTime dt; 
if (DateTime.TryParseExact("05#12#2017 15:36", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) 
{ 
    // Use dt 
} 
else 
{ 
    // No format matched 
} 

これはむしろ一つの形式以外の形式の文字列配列を、受け入れDateTime.TryParseExactを使用して動作します。これは次の理由により動作します。

文字列表現の形式は、指定された形式のうちの少なくとも1つと正確に一致する必要があります。

すべての区切り文字は、入力文字列内で同じでなければならず、混在しないことに注意してください。

オプションで、HH:mmを含まない他の形式を追加することもできます。例えば:IFormatProviderに応じてサンプルと

... 
string formatWithTime = "dd?MM?yyyy HH:mm"; 
string formatWithoutTime = "dd?MM?yyyy"; 
List<string> f = new List<string>(); 
foreach (char c in separators) 
{ 
    f.Add(formatWithTime.Replace('?', c)); 
    f.Add(formatWithoutTime.Replace('?', c)); 
} 
string[] formats = f.ToArray(); 
... 
0

DateTime.Parse作品:

var ci = new CultureInfo("pl"); 
var d1 = DateTime.Parse("05.03.2016 04:19", ci); 
var d2 = DateTime.Parse("05-03-2016 04:19", ci); 
var d3 = DateTime.Parse("05/03/2016"  , ci); 
var d4 = DateTime.Parse("2016/03/05 04:19", ci); 
+0

私は可能な限り日付の組み合わせの広い範囲で動作するようにしようとします。これは、異なるファイルを解析するためのものです。そのため、ファイルの日付のカルチャが実際にはわかりません。 – FCin

+0

@FCin DateTime.Parseは単語を含む多くのケースを処理するので、 'DateTime.TryParse'が失敗するケースのみを処理することが最善の方法だと思います。 – Slai

関連する問題