C# string.Format不';无法在服务器上应用自定义格式

C# string.Format不';无法在服务器上应用自定义格式,c#,cultureinfo,timespan,string.format,C#,Cultureinfo,Timespan,String.format,我正在做以下工作: //TimeSpan rebateTime //int percentage string text = string.Format( CultureInfo.CurrentCulture, "Rebate {0}% during {1:hh} h {1:mm} min", percentage, rebateTime; 在my dev pc上,文本包含: Rebate 32% during 05 h 00 min Rebate 32

我正在做以下工作:

//TimeSpan rebateTime
//int percentage
string text = string.Format(
    CultureInfo.CurrentCulture, 
    "Rebate {0}% during {1:hh} h {1:mm} min", 
    percentage, 
    rebateTime;
在my dev pc上,文本包含:

Rebate 32% during 05 h 00 min
Rebate 32% during 05 h 00 min
Rebate 32% during 05:00:00 h 05:00:00 min
在my dev测试服务器上,文本包含:

Rebate 32% during 05 h 00 min
Rebate 32% during 05 h 00 min
Rebate 32% during 05:00:00 h 05:00:00 min
在my上,共享测试服务器文本包含:

Rebate 32% during 05 h 00 min
Rebate 32% during 05 h 00 min
Rebate 32% during 05:00:00 h 05:00:00 min

这怎么可能呢?

我在这里重复了你的错误

此格式仅适用于.NET 4。您的共享服务器中可能没有安装.NET 4

请参阅中的“设置时间跨度值的格式”部分

要检查这一点,请创建一个简单的控制台项目:

    static void Main(string[] args)
    {
        Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Rebate {0}% during {1:hh} h {1:mm} min", 0.15, new TimeSpan(DateTime.Now.Ticks)));
        Console.ReadKey();
    }
产出:

.NET 4

"Rebate 0.15% during 11 h e 47 min"
.NET 3.5

"Rebate 0,15% during 735275.11:48:48.7362198 h 735275.11:48:48.7362198 min"

正如其他人所指出的,TimeSpan在.NET4之前没有自定义格式。但是,替代解决方案一点也不复杂:

string.Format
(
    "Rebate {0}% during {1:##} h {2:##} min", 
    percentage, 
    rebateTime.TotalHours, 
    rebateTime.Minutes
);

碰巧今天我也遇到了同样的问题。 我使用扩展方法修复了它:

    public static string ToReadableString(this TimeSpan span)
    {
        string formatted = string.Format("{0}{1}{2}{3}",
            span.Duration().Days > 0 ? string.Format("{0:0} day{1}, ", span.Days, span.Days == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Hours > 0 ? string.Format("{0:00} hour{1}, ", span.Hours, span.Hours == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Minutes > 0 ? string.Format("{0:00} minute{1}, ", span.Minutes, span.Minutes == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Seconds > 0 ? string.Format("{0:00} second{1}", span.Seconds, span.Seconds == 1 ? String.Empty : "s") : string.Empty);

        if (formatted.EndsWith(", ")) formatted = formatted.Substring(0, formatted.Length - 2);

        if (string.IsNullOrEmpty(formatted)) formatted = "0 seconds";

        return formatted;
    }

当它在时间跨度上使用时,您将获得以下格式的时间(x天x小时x分x秒),当某些内容不可用时,它将被隐藏。

您发布的代码无效。。。它甚至不是有效的C#,并且您只指定了三个格式参数中的两个。请发布一个简短但完整的程序来演示这个问题。另外,请告诉我们您在服务器上使用的.NET版本。我相信TimeSpan的自定义格式只是在.NET4中引入的。@JonSkeet很棒的提示!听起来这就是问题所在。我将进行验证。@JonSkeet代码已更新,它在小时和分钟内使用相同的参数。它仍然不是有效的代码,它仍然不是一个简短但完整的示例。但希望这只是您正在使用的.NET版本的问题。(我们不知道这是否是一个ASP.NET网站,一个WCF服务等等,这并没有帮助。)发生这种情况的原因确实是因为我也在使用.NET 3.5框架(就像sharepoint 2009迁移项目一样)。