■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);
}
}
}
|
|