C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: string型の日付フォーマットを判別


(過去ログ 86 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■51241 / inTopicNo.1)  string型の日付フォーマットを判別
  
□投稿者/ 阿波ロマン (1回)-(2010/06/28(Mon) 23:32:57)

分類:[C#] 

お力を貸してください。

VisualStudio2005でC#を使って開発をしています。



string型の変数に日付型変換可能な文字列が入っているとして、
その変数のフォーマットを判別することは可能でしょうか?

例えば、

string AAA = "2010/06/28";

という変数があったとして、
変数AAAには"yyyy/MM/dd"の文字列が入っているのか、
"yyyy/MM/dd HH:mm:ss"なのか、"yyyy/MM/dd hh:mm:ss"なのか、
といった判別がしたいのですが、どのようにすれば判別できるでしょうか。

引用返信 編集キー/
■51243 / inTopicNo.2)  Re[1]: string型の日付フォーマットを判別
□投稿者/ かたぎり (33回)-(2010/06/28(Mon) 23:52:16)
正規表現を書いて、正規化クラスRegexのMatchメソッドで判定すれば出来るのではないでしょうか。

引用返信 編集キー/
■51245 / inTopicNo.3)  Re[2]: string型の日付フォーマットを判別
□投稿者/ 阿波ロマン (3回)-(2010/06/29(Tue) 00:11:46)
No51243 (かたぎり さん) に返信
> 正規表現を書いて、正規化クラスRegexのMatchメソッドで判定すれば出来るのではないでしょうか。
>

違っていたらすいません。

正規表現で判別するということは
日付変換可能なフォーマット毎にのif文分岐をするということでしょうか?

それだと日付変換可能なフォーマットを全て洗い出す必要があるのと、
何か抜け落ちそうで、
出来ればフォーマット毎に分岐を作るようなマネはしたくないのですが、
やはり難しいでしょうか
引用返信 編集キー/
■51246 / inTopicNo.4)  Re[3]: string型の日付フォーマットを判別
□投稿者/ Hongliang (659回)-(2010/06/29(Tue) 00:38:16)
01/01/01 が yy/MM/dd なのか dd/MM/yy なのか MM/dd/yy なのか、どうやって区別します?
引用返信 編集キー/
■51250 / inTopicNo.5)  Re[4]: string型の日付フォーマットを判別
□投稿者/ かたぎり (34回)-(2010/06/29(Tue) 08:52:51)
んー、それはつまり、

日付かどうか、何がはいってくるか判らない、文字列型が処理対象で
データの元となる日付データも出所が判らない、という要件、ということですか?

不特定内容に関して、日付かどうかを判断したい、というのであれば、
Date型のParseを使ってある程度は判定できるでしょうが、確実ではありませんし
確かに無限のパターンを洗い出す必要がありますね

阿波ロマンさんの立場、役割、目的によって手段は異なりますが
まずは、データ元の仕様を確定してから、それに対して正しい入力であることをチェックする、
という流れに根本から見直す方が近道であるように思います。

引用返信 編集キー/
■51253 / inTopicNo.6)  Re[3]: string型の日付フォーマットを判別
□投稿者/ 魔界の仮面弁士 (1687回)-(2010/06/29(Tue) 10:34:05)
No51245 (阿波ロマン さん) に返信
変換だけであれば、

  bool result = DateTime.TryParseExact(
    "変換対象データ",
    new string[] { 書式1, 書式2, 書式3, … },
    処理カルチャのDateTimeFormatInfo,
    DateTimeStylesによる形式指定,
    out 日付型変数
  );

を使えば良いと思いますが、どの書式にヒットしたかも知りたいなら、

  bool result = DateTime.TryParseExact(
    "変換対象データ",
    書式,
    処理カルチャのDateTimeFormatInfo,
    DateTimeStylesによる形式指定,
    out 日付型変数
  );

を順に試していってみては如何でしょう。



> それだと日付変換可能なフォーマットを全て洗い出す必要があるのと、
今回の場合、複数の書式にヒットした場合の優先順位を決めておく必要が
ありますから、やはり洗い出しは必要かと思います。

それに、事前に洗い出しておかないと不安がありませんか?

たとえば VBScript や VBA が標準で持つ日付判定/日付変換関数は、
かなり曖昧な文字列も解析してくれるため、
  "S64, Dec 31"
  "APr,9876"
  "1A"
  "3P"
  "654321.0987"
  "34,56,78-"
なども、有効な値として認識されていました。

しかし、これらを認識されては困るケースもあったため、
自前で判定処理を組み込むことが多かったです。


なお、こうしたレガシー VB に近い日付変換/判定処理を行いたいなら、C# から
Microsoft.VisualBasic.CompilerServices.Conversions.ToDate メソッドや
Microsoft.VisualBasic.Information.IsDate メソッドを使うという選択肢もあります。

また、レガシー VB と完全に同じ判定を求めるなら、VarDateFromStr API を使えます。
http://msdn.microsoft.com/en-us/library/ms891612.aspx

いずれも、『日付フォーマットを判別』という処理では無く、
『フォーマットを自動判別して日付に変換』という処理なので、
今回の質問内容からは微妙に外れてしまいますけれどね。


class Program
{
    [DllImport("oleaut32")]
    static extern int VarDateFromStr(
        [MarshalAs(UnmanagedType.BStr)] string strIn,
        int LCID,
        uint dwFlags,
        out double pdateOut);

    static void Main(string[] args)
    {
        string s = "APr,9876";

        double d;
        int HResult = VarDateFromStr(
            s,
            CultureInfo.CurrentCulture.LCID,
            0,
            out d);

        if (HResult == 0)
        {
            DateTime dt = DateTime.FromOADate(d);
            Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture));
        }
        else
        {
            throw Marshal.GetExceptionForHR(HResult);
        }
    }
}

引用返信 編集キー/
■51254 / inTopicNo.7)  Re[5]: string型の日付フォーマットを判別
□投稿者/ .SHO (1356回)-(2010/06/29(Tue) 10:44:17)
No51250 (かたぎり さん) に返信
> んー、それはつまり、
>
> 日付かどうか、何がはいってくるか判らない、文字列型が処理対象で
> データの元となる日付データも出所が判らない、という要件、ということですか?

少なくともスレ主さんは「string型の変数に日付型変換可能な文字列が入っている」
という前提条件は付けてますね。
引用返信 編集キー/
■51256 / inTopicNo.8)  Re[4]: string型の日付フォーマットを判別
□投稿者/ 渋木宏明 (7回)-(2010/06/29(Tue) 13:28:41)
渋木宏明 さんの Web サイト
> 日付かどうか、何がはいってくるか判らない、文字列型が処理対象で
> データの元となる日付データも出所が判らない、という要件、ということですか?

加えて、カルチャがどーなん(不明?可変?固定?)とかも重要。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -