7

将 string.format 的常见格式(例如日期时间)提取为可访问常量的优雅方法是什么?

理想情况下,我想做类似以下的事情,但是当我尝试使用此代码时出现以下错误。

var now = DateTime.Now;
var format = "yyyy-MM-dd";
Console.WriteLine(string.Format("The date is {1:{0}}", format, now));

[System.FormatException:输入字符串的格式不正确。] 在 Program.Main():第 9 行

这背后的原因是某些 API 需要特定的日期时间格式。我希望能够引用一个地方来获取该格式,这样所有或所有调用都不起作用。

我意识到以下将起作用,但它似乎不是很优雅。

Console.WriteLine(string.Format("The date is {1:" + format + "}", format, now));
4

4 回答 4

2

您可以在 下找到所有使用的格式字符串DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns()

之后,您可以单独尝试使用每个值解析您的输入数据,并查看返回的值true(参见:)DateTime.TryParseExact()

Console.WriteLine (DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns());

在此处输入图像描述

示例代码:

void Main()
{
    var now = DateTime.Now.ToString();

    foreach(var format in DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns()){
        DateTime result;
        if(DateTime.TryParseExact(now, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out result)){
            Console.WriteLine(string.Format("The date is {0}, the format is: {1}", result, format));
        }
    }
}

在此处输入图像描述

于 2014-03-31T19:27:59.733 回答
2

你可以去一个应用程序常量路由 - 一个保存你的格式字符串的静态类。

namespace App.Framework {
    public static class AppConstant {
        public static readonly string DisplayDateShort = "MM/dd/yyyy";
    }
}

就您的示例而言,它有点缺陷;你想呼吁ToString()你的DateTime价值。

Console.WriteLine(now.ToString(AppConstant.DisplayDateShort));

于 2014-03-31T19:28:17.213 回答
1

您可以考虑将格式推送到可以根据需要使用的扩展方法中,即:

public static class DateExt
{
    public static string FormatAsSomething( this DateTime dt )
    {
        string format = "yyyy-MM-dd";
        string result = dt.ToString( format );
        return result;
    }
}

接着:

var now = DateTime.Now;
Console.WriteLine( "The date is {0}", now.FormatAsSomething() );

每当需要更新格式时,只需更新扩展方法即可。

于 2014-03-31T19:35:36.540 回答
0

您可以为值使用自定义格式提供程序DateTime

static void Main(string[] args)
{
    var now = DateTime.Now;

    var str = string.Format(new MyDateFormatter(), "The date is {0}", now);

    Console.WriteLine(str);

    MyDateFormatter.DefaultDateFormat = "dd-MM-yyyy HH:mm";

    str = string.Format(new MyDateFormatter(), "The date is {0}", now);

    Console.WriteLine(str);
}

public class MyDateFormatter: IFormatProvider, ICustomFormatter
{
    public static string DefaultDateFormat = "yyyy-MM-dd";

    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;

        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        // Check whether this is an appropriate callback              
        if (!this.Equals(formatProvider))
            return null;

        var argFormat = "{0:" + (arg is DateTime ? DefaultDateFormat : string.Empty) + "}";

        return string.Format(argFormat, arg);
    }
}
于 2014-03-31T19:54:03.703 回答