2017-09-06 10 views
-2

私はこの問題に簡単な答えがあると思います。基本的に私は、本質的に '9062017'であるデータベースからDateTimeを10進数で格納しています。私は小数点以下の拡張メソッドを作成して、小数点および解析を説明し、拡張可能なDateTimeの可変フォーマットを作成したいと考えていました。私はロジックで遊んでいましたが、それは動作しません。私はこのようにSOの上にいくつかのスレッドを探していた:Parse datetime in multiple formats。しかし、それは私が働いていると思うものを説明するものではありません。先頭のゼロを取り除いた複数の日付形式のDecimal to DateTimeの解析?

static void Main(string[] args) 
{ 
    DateTime d = new DateTime(2017, 9, 6); 
    //Cool what I would expect to show the day position with two digits and the month uses one if needed else it will go to two if needed. 
    Console.WriteLine(d.ToString("Mddyyyy")); 

    //I can parse out an int and see it is exactly as above. 
    int i = Int32.Parse(d.ToString("Mddyyyy")); 
    Console.WriteLine(i.ToString()); 

    DateTime dt; 
    string[] formats = { "Mddyyyy", "MMddyyyy" }; 
    //Keeps default min value of DateTime and ignores parsing regardless of formats done in the first arg changes, the seconds formats to apply, or cultural changes. 
    DateTime.TryParseExact(i.ToString(), formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 

    Console.WriteLine(dt); 


    //Console.WriteLine(i); 
    Console.ReadLine(); 
} 
+1

を、私は**非常に強く**そのように日時を格納に対してお勧めします - * particuarly *月/日/年でこれはソートできません。もしあなたが本当にそれをやりたいのであれば、文字列部分を完全に取り除くことができます - すべての作業を整数で直接行います。 –

+0

@JonSkeet私は同意します。残念ながら、それは最終的に私はちょうどそれを取得し、より良い形をしようとしている自分のコードベースを維持していないサードパーティです。 – djangojazz

+0

10進数の日付がパックされている可能性があります。以下を参照してください。https://www.ibm.com/support/knowledgecenter/en/SS6SGM_3.1.0/com.ibm.aix.cbl.doc/PGandLR/concepts/cpari09.htm – jdweng

答えて

2

私はあなたが完全に文字列変換を避けるべきだと思います。無意味でエラーが発生しやすいです。

public static DateTime Int32ToDateTime(int value) 
{ 
    int year = value % 10000; 
    int day = (value/10000) % 100; 
    int month = value/1000000; 
    // Specify whatever kind is appropriate; it's unclear from the question. 
    return new DateTime(year, month, day); 
} 

public static int DateTimeToInt32(DateTime date) => 
    date.Year + (date.Day * 10000) + (date.Month * 1000000); 

私はこのために拡張メソッドを使用しません。すべての整数には適切ではありません。 、実際にはにする必要があります。あなたが複数の数値形式を持っている場合は、インターフェイスに複数の実装かもしれない:まず

public interface IDateTimeInt32Converter 
{ 
    DateTime Int32ToDateTime(int value); 
    int Int32ToDateTime(DateTime date); 
} 

public class YearMonthDayConverter : IDateTimeInt32Converter 
{ 
    // etc 
} 

// Ditto for MonthDayYearConverter and DayMonthYearConverter 
+0

私はあなたのやり方に同意します。しかし、私はこの "Mddyyyy"、 "Mdyy"、そしてより歓迎された "yyyyMMdd"を行う第三者に対処したので、複数のフォーマットを実行できるようにしたい。私はまだ遊んでいましたが、あなたがやっている残りの部分を行うための文字列と位置を見つけることを考えていました。私はちょうどそれらの残りの位置がフォーマットの長さに基づいて年のテキストを見つけるところに基づいて変えたいと思う。 – djangojazz

+1

@djangojazz: "Mdyy"はあいまいさのために単なる壊れたフォーマットです。あなたはそれでチャンスがありません。私はあなたが同じ悪いアプローチ(整数を日付として保存する)を取っている複数のサードパーティを持っているが、さまざまな方法でそれが変わっていることは奇妙なことです。それが本当に本当の場合は、3つの異なる方法で算術演算を実行する3つの異なる実装を持つインターフェースを常に作成することができます。私はまだ、変換のソースもターゲットも実際に文字列でないときに、文字列の操作よりもそれをとっています。 –

+0

'変換のソースもターゲットも実際には文字列でない場合でも、私はそれでも文字列の操作を引き継ぎます。答えを変えて複数の実装でインターフェイスを使用し、拡張メソッドを使わないようにすると、私は好奇心を抱かせました。私はちょうど心の怠惰な開発者であり、やっていることの怠惰(あるint)が好きです。GetADate( "Mddyyyy");それは本当に広範なコードベースを入力したくないという私のことですが、道路の下ではそれが私を燃やして、私はあなたのポイントを見ることができます。 – djangojazz

0

私は(のように、あなたがこれまで行ってきたよりも多くのコードを書くことを期待する)あなたのケースでは、庭のパスダウン旅になるだろうので、あなたは離れてTryParseExactから向きを変えるべきだと思います。

より単純で、おそらくより簡単なアプローチは、10進値の文字列表現を単純に解析することです。ここで

は、私が何を意味するか説明するためのサンプルです:

var d = 9062017.0; 
var s = d.ToString(); 

if (s.IndexOf(".") > -1) 
    s = s.Substring(0, s.IndexOf(".")); 

string mm = "", dd = "", yy = ""; 

// single-digit month? 
if (s.Length == 7) 
{ 
    mm = s.Substring(0, 1); 
    dd = s.Substring(1, 2); 
    yy = s.Substring(3);  
} 

if (s.Length == 8) 
{ 
    mm = s.Substring(0, 2); 
    dd = s.Substring(3, 2); 
    yy = s.Substring(4); 
} 

// rather than parse directly to DateTime, just parse 
// the individual date portions as ints... 
var year = Convert.ToInt32(yy); 
var month = Convert.ToInt32(mm); 
var day = Convert.ToInt32(dd); 

// transform into the date... 
var dt = new DateTime(year, month, day); 
+0

あなたの例では絶対的な位置付けを想定しています。もし私がこのルートに行くなら、私は、それぞれの特定のフォーマットを逐語的に説明するために大量のコードを作る必要があります。私の質問には、最終的にこの部分があります。「小数点を解析して解析し、拡張可能なDateTimeの変数形式を行う小数点の拡張メソッドを作成したいと思っていました。変数の書式はコード上で直ちに中断します。私は9162017.GetDateTime( "mddyyyy")や201765.GetDateTime( "yyyymd")のような拡張可能な拡張メソッドを実行したいと思っていました。 – djangojazz

+0

@djangojazz:基本的に、あなたは "mmddyyyy"や "mddyyyy"よりも多くのフォーマットを持っていますか?もう少し詳しくお聞かせください。私はあなたの例に基づいて、シーケンスが月 - 日 - 年であると仮定していましたが、そのうちの2つの順列しかありません。私に何が足りないのか教えてください! – code4life

+0

最後に擬似コードで説明しました。私はこれがGACの.NETにもっと組み込まれると思っていて、それがそれを説明しなかったのに驚いた。 – djangojazz

関連する問題