ISO8601形式の日付の配列があり、それらを並べ替える必要があります。誰かがうまくいくアルゴリズムの提案がありますか?間違えない限り文字列に分類されるとは思わないので、構成要素に分解する必要があると思いますか?
誰かがアルゴリズムを投稿できますか、できれば言語に依存しませんが、VBまたはC#の例は、文字列と整数のみを使用し、言語に組み込まれている関数がない限り機能します。
ありがとう!
ISO8601形式の日付の配列があり、それらを並べ替える必要があります。誰かがうまくいくアルゴリズムの提案がありますか?間違えない限り文字列に分類されるとは思わないので、構成要素に分解する必要があると思いますか?
誰かがアルゴリズムを投稿できますか、できれば言語に依存しませんが、VBまたはC#の例は、文字列と整数のみを使用し、言語に組み込まれている関数がない限り機能します。
ありがとう!
フォーマットを混在させるかどうかによって異なります。
yyyy-mm-dd
やなどの特定の形式内でyyyy-Www-d
は、ISO 8601 は (負の年を除いて) 辞書式に並べ替えるように構築されています。
ISO 8601 ウィキペディアのページから:
日付と時刻の値は、年、月 (または週)、日、時、分、秒、および秒以下の順に編成されます。したがって、表現の辞書式順序は、負の年を含む日付表現を除いて、年代順に対応します。これにより、日付をファイル システムなどで自然に並べ替えることができます。
つまり、文字列の並べ替えは正常に機能するはずです。
フォーマットを混在させた場合にのみ機能しません。その場合は、比較する前に特定の形式に変換する必要があります。つまり、すべての形式を比較前に変換しyyyy-mm-dd
、必要に応じて後で元に戻すようなことを意味します。
たとえば、入力データがある場合:
2010-03-01
2010-W01-1
最初にすべてを次のように変更できます。
2010-03-01:2010-03-01
2010-01-04:2010-W01-1
(実際のデータの前に特定の形式を付けて)それをソートします。ソートしたら、戻って:
各要素の最初の文字まですべてを削除すると、元のフォームが復元されます。
必ずしも最も効率的な方法ではありませんが、元のフォームを保持したい場合は、そのようなことを行う必要があります。それが問題にならない場合は、一度特定の形式に変換してそのままにしてください。
よっぽど間違っていない限り、文字列としてソートされるとは思いませんが、
あなたは大いに間違っています:-)。それらは文字列†</sup>としてソートされます。これは、他の日付形式に対する ISO 8601 の大きな利点の 1 つです。
ポイント 1 を参照してください: http://en.wikipedia.org/wiki/ISO_8601#General_principles
...したがって、表現の辞書順は時系列に対応します...
†</sup>負の年を扱っていない限り、同じタイムゾーンとサブフォーマットを使用しています。つまり、月ベースと週ベースを混在させていません (これらを指摘してくれた @paxdiablo と @whiskeysierra に感謝します)。