6

DateTime 文字列から書式文字列を取得できるようにしたいと考えています。

例えば

"2012-12-08 15:00:00" => "yyyy-MM-dd HH:mm:ss"

"2013/30/01 16:00" => "yyyy/dd/MM HH:mm"

これは可能ですか?

4

4 に答える 4

8

これを完全に一般的な方法で行うのは非常に難しいでしょうが、1 つのオプションは、DateTimeFormatInfo関心のある関連を抽出し ( を使用CultureInfo.DateTimeFormat)、そこから文化固有のパターンを抽出し (など) LongDatePatternLongTimePatternパターンを適切に組み合わせることです。場合によっては (例: ShortDatePatternspace 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))
    }
}
于 2013-09-19T10:13:54.870 に答える
2

一連の事前定義された形式を使用して日付を解析し、それが合格するかどうかを確認すると、探している文字列形式を取得できます。

答えを参照してくださいが、それはJavaにあります - How to get the given date string format(pattern) in Java?

于 2013-09-19T10:13:48.233 に答える
1

私は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);
于 2013-09-19T10:24:50.067 に答える
0

以下のコードを記述してyyyy/dd/MM HH:mmフォーマットを取得してみてください。

DateTimeFormatInfo df1 = new DateTimeFormatInfo();
df1.SortTimePattern();

HH:mmそれはあなたに同じフォーマットを与えるでしょう。

于 2016-03-31T05:52:24.950 に答える