解析DateTime格式以获取格式字符串

时间:2013-09-19 10:04:33

标签: c# parsing datetime format-string

我希望能够从DateTime字符串中获取格式字符串

e.g。

  

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

     

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

这可能吗?

4 个答案:

答案 0 :(得分:8)

以完全一般的方式完成此操作会非常困难,但一种选择是提取您感兴趣的相关DateTimeFormatInfo(使用CultureInfo.DateTimeFormat),提取文化 - 特定模式(LongDatePatternLongTimePattern等)在某些情况下(例如ShortDatePattern空间ShortTimePattern)适当地组合模式,然后使用{{ 1}} - 记住每次仍然指定文化,以便适当地处理日期分隔符等。

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>

答案 1 :(得分:2)

您可以拥有一组预定义格式并解析日期并查看它是否通过,然后您就可以获得所需的字符串格式。

请参阅答案,但请参阅java - How to get the given date string format(pattern) in java?

答案 2 :(得分: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);

答案 3 :(得分:0)

您可以尝试编写以下代码以获取FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.show(getFragmentManager().findFragmentByTag(fragmentTagToBeShown)); transaction.hide(getFragmentManager().findFragmentByTag(currentFragmentTag)); transaction.commit(); 格式。

Fragment myFragment = new MyFragemnt();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.add(R.id.fragmentContainer, myFragment, SOME_TAG);
    transaction.hide(myFragment);
    transaction.commit();

它会给你相同的yyyy/dd/MM HH:mm格式。