【问题标题】:Is there a way to set an application level datetime format?有没有办法设置应用程序级别的日期时间格式?
【发布时间】:2015-12-16 02:33:43
【问题描述】:

C# / MVCMM/DD/YYYY 格式生成datetime,但有时我需要输入DD/MM/YYYY 格式。这是通过提供自定义格式来完成的。但是,与其编写代码让 C# 生成日期时间为DD/MM/YYYY,我是否可以进行应用程序级别的配置,例如更改web.configapp.configmachine.config

【问题讨论】:

  • 您可以在web.config 文件中设置文化(但不清楚有时是什么意思 - 您是否希望不同控制器方法的文化有所不同?)
  • @StephenMuecke 所以我假设如果不同控制器中的不同日期格式然后手动格式化但如果一种格式整个应用程序将是 web.config 中的文化?
  • @StephenMuecke 如果您可以发布如何设置它,那么当我设置这种文化时,它会影响所有其他配置,例如货币和时区,因为它不应该只是时间格式需要改变
  • 是的,如果您想设置服务器文化,您可以使用(比如说)<system.web><globalization culture="en-AU" uiCulture="en-AU" />(澳大利亚)。如果您有时想要不同的格式,那么您必须在控制器中设置文化。
  • @StephenMuecke 但这会影响货币和时区等其他设置吗?

标签: c# asp.net-mvc-4


【解决方案1】:

如果您只想在应用程序范围内设置日期格式,您可以在 Web.config 中设置文化

<globalization culture="en-GB" />

但是,如果您想减少重复代码,您可以更改当前线程的文化,然后在您完成对date.ToShortDateString() 的调用后立即将其切换回来。这是一个 CultureContext 类,它将仅在 using 块内部更改格式。

/// <summary>
/// Allows switching the current thread to a new culture in a using block that will automatically 
/// return the culture to its previous state upon completion.
/// </summary>
public class CultureContext
    : IDisposable
{
    public CultureContext(
        CultureInfo culture,
        CultureInfo uiCulture
        )
    {
        if (culture == null)
            throw new ArgumentNullException("culture");
        if (uiCulture == null)
            throw new ArgumentNullException("uiCulture");

        this.currentThread = Thread.CurrentThread;

        // Record the current culture settings so they can be restored later.
        this.originalCulture = this.currentThread.CurrentCulture;
        this.originalUICulture = this.currentThread.CurrentUICulture;

        // Set both the culture and UI culture for this context.
        this.currentThread.CurrentCulture = culture;
        this.currentThread.CurrentUICulture = uiCulture;
    }

    private readonly Thread currentThread;
    private readonly CultureInfo originalCulture;
    private readonly CultureInfo originalUICulture;

    public CultureInfo OriginalCulture
    {
        get { return this.originalCulture; }
    }

    public CultureInfo OriginalUICulture
    {
        get { return this.originalUICulture; }
    }

    public void Dispose()
    {
        // Restore the culture to the way it was before the constructor was called.
        this.currentThread.CurrentCulture = this.originalCulture;
        this.currentThread.CurrentUICulture = this.originalUICulture;
    }
}

用法

// Temporarily override the current thread's culture with the invariant culture
using (var cultureContext = new CultureContext(
    CultureInfo.InvariantCulture,
    System.Threading.Thread.CurrentThread.CurrentUICulture))
{
    // All date formats here will be in the invariant culture

    using (var originalCultureContext = new CultureContext(
        cultureContext.OriginalCulture, 
        cultureContext.OriginalUICulture))
    {
        // All date formats here will be in the default culture
    }

    // All date formats here will be in the invariant culture

}

请参阅this answer 了解文化和 UI 文化之间的区别。

【讨论】:

    【解决方案2】:

    尝试在 Web.config 中设置文化

    <globalization culture="en-GB"/>
    

    【讨论】:

    • 这会影响货币和时区等其他设置
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多