DateTime 文字列から書式文字列を取得できるようにしたいと考えています。
例えば
"2012-12-08 15:00:00" => "yyyy-MM-dd HH:mm:ss"
"2013/30/01 16:00" => "yyyy/dd/MM HH:mm"
これは可能ですか?
DateTime 文字列から書式文字列を取得できるようにしたいと考えています。
例えば
"2012-12-08 15:00:00" => "yyyy-MM-dd HH:mm:ss"
"2013/30/01 16:00" => "yyyy/dd/MM HH:mm"
これは可能ですか?
これを完全に一般的な方法で行うのは非常に難しいでしょうが、1 つのオプションは、DateTimeFormatInfo
関心のある関連を抽出し ( を使用CultureInfo.DateTimeFormat
)、そこから文化固有のパターンを抽出し (など) LongDatePattern
、LongTimePattern
パターンを適切に組み合わせることです。場合によっては (例: ShortDatePattern
space ShortTimePattern
)、次に使用して各パターンを順番に試してくださいDateTime.TryParseExact
- 日付区切り記号などを適切に処理するために、毎回カルチャを指定することを忘れないでください。
がDateTime.TryParseExact
返されると、指定されたテキストを解析するパターンがあることtrue
がわかります。
サンプル コード - 動作すると思われるが実際には動作しない例を示します。
using System;
using System.Collections.Generic;
using System.Globalization;
class Test
{
static void Main()
{
var us = new CultureInfo("en-US");
var uk = new CultureInfo("en-GB");
string text = "07/06/2013 11:22:11";
// This one fails, as there's no appropriate time format
Console.WriteLine(GuessPattern(text, us));
// This one prints dd/MM/yyyy HH:mm:ss
Console.WriteLine(GuessPattern(text, uk));
}
static string GuessPattern(string text, CultureInfo culture)
{
foreach (var pattern in GetDateTimePatterns(culture))
{
DateTime ignored;
if (DateTime.TryParseExact(text, pattern, culture,
DateTimeStyles.None, out ignored))
{
return pattern;
}
}
return null;
}
static IList<string> GetDateTimePatterns(CultureInfo culture)
{
var info = culture.DateTimeFormat;
return new string[]
{
info.FullDateTimePattern,
info.LongDatePattern,
info.LongTimePattern,
info.ShortDatePattern,
info.ShortTimePattern,
info.MonthDayPattern,
info.ShortDatePattern + " " + info.LongTimePattern,
info.ShortDatePattern + " " + info.ShortTimePattern,
info.YearMonthPattern
// Consider the sortable pattern, ISO-8601 etc
};
}
}
機能すると予想される「追加の」日付と時刻の形式をハードコードする可能性があります。
編集:あいまいさを処理するために、単一の文字列の代わりに簡単にGuessPattern
返すことができます:IEnumerable<string>
static IEnumerable<string> GuessPatterns(string text, CultureInfo culture)
{
DateTime ignored;
return GetDateTimePatterns(culture)
.Where(pattern => DateTime.TryParseExact(text, pattern, culture,
DateTimeStyles.None, out ignored))
}
}
一連の事前定義された形式を使用して日付を解析し、それが合格するかどうかを確認すると、探している文字列形式を取得できます。
答えを参照してくださいが、それはJavaにあります - How to get the given date string format(pattern) in Java?
私はJon Skeetと同じアイデアを持っていて、それを実装しました:
// Helper method
IEnumerable<string> DateTimeFormatPatterns(DateTimeFormatInfo format)
{
var accessors = new Func<DateTimeFormatInfo, string>[]
{
f => f.FullDateTimePattern,
f => f.LongDatePattern,
f => f.LongTimePattern,
f => f.MonthDayPattern,
f => f.ShortDatePattern,
f => f.SortableDateTimePattern,
f => f.UniversalSortableDateTimePattern,
f => f.YearMonthPattern,
};
return accessors.Select(accessor => accessor(format));
}
// The real function
string DetectDateTimeFormat(string date, CultureInfo culture)
{
DateTime dummy;
foreach (var pattern in DateTimeFormatPatterns(culture.DateTimeFormat))
{
if (DateTime.TryParseExact(date, pattern, culture,
DateTimeStyles.None, out dummy))
{
return pattern;
}
}
return null;
}
ここには改善の余地があります (たとえば、ハードコードされたDateTimeStyles.None
ものは役に立ちません。現在のカルチャが役立つと想定するオーバーロードも役に立ちます)。ただし、次のように使用できます。
var format = DetectDateTimeFormat("2012-12-08 15:00:00",
CultureInfo.CurrentCulture);
以下のコードを記述してyyyy/dd/MM HH:mm
フォーマットを取得してみてください。
DateTimeFormatInfo df1 = new DateTimeFormatInfo();
df1.SortTimePattern();
HH:mm
それはあなたに同じフォーマットを与えるでしょう。