asp.Net在异常区域设置中奇怪日期时间格式(带星期)问题的处理

asp.Net在异常区域设置中奇怪日期时间格式(带星期)问题的处理,让程序自定义区域的属性,至少可以统一输出日期时间格式,使其脱离系统环境变量。

今天在用户那里搭建演示环境,不知哪里的问题,从数据库查到的日期时间格式居然带着星期(2022-10-09 星期日 10:22:39)

在控制面板中设置了日期时间格式,重启IIS,但是程序中依然没有生效。

干脆上网查,找到一个方案:

1、设置CultureInfo(多线程时仅当前线程有效)

2、 将下面的SetDefaultCulture()函数在Application_Start()中调用一次,成了。

为什么需要SetDefaultCulture()函数呢?

原来,当我们在.Net中新开一个线程时,其默认的CurrentCulture属性为当前系统的Culture,在软件的本地化没有完成的情况下,采用默认系统的文化编码方式,可能会导致软件在界面显示,数字、符号、时间格式化等方面出现异常,导致软件运行错误。例如在中英文系统中,一般采用点号作为double类型数据的分隔符,而在俄语系统中采用逗号作为分隔。

如果要改变其CurrentCulture属性,一般通过修改 Thread.CurrentCulture值来实现。然而,当新开线程较多时,逐一设置极为麻烦,容易产生疏漏。为此,这里有一种通用的默认CultureInfo属性设置方案。

若.Net环境是framework4.5及以上版本时,CultureInfo提供了两个静态属性 DefaultThreadCulture和DefaultThreadUICulture,一处修改即可实现所有的未显式设置 Thread.CurrentCulture的线程使用该Default值。

而若.Net环境是framework4.0版本时,可通过反射设置两个私有静态字段s_userDefaultCulture和s_userDefaultUICulture来实现。

如果.Net环境是framework4.0以下版本时,可通过反射来设置两个私有静态字段m_userDefaultCulture和m_userDefaultUICulture来实现。

至少,有了这个方案,再也不需要在 DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 时写格式字符串了。

总之,做个记录,防止需要时找不到。

// ...\Global.asax.cs

protected void Application_Start(object sender, EventArgs e)
{
    ApplicationInitializer.Initialize();
    CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    culture.DateTimeFormat.ShortDatePattern = "yyyy.MM.dd HH:mm:ss";
    culture.DateTimeFormat.LongTimePattern = "";
    //Thread.CurrentThread.CurrentCulture = culture;

    SetDefaultCulture(culture);

    .... 
}
// 新建一个类或者也加在 ...\Global.asax.cs 中

using System.Globalization;
using System.Reflection;

public void SetDefaultCulture(CultureInfo culture)
{
    Type type = typeof(CultureInfo);

    try
    {
        type.InvokeMember("s_userDefaultCulture",
                            BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                            null,
                            culture,
                            new object[] { culture });

        type.InvokeMember("s_userDefaultUICulture",
                            BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                            null,
                            culture,
                            new object[] { culture });
    }
    catch { }

    try
    {
        type.InvokeMember("m_userDefaultCulture",
                            BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                            null,
                            culture,
                            new object[] { culture });

        type.InvokeMember("m_userDefaultUICulture",
                            BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                            null,
                            culture,
                            new object[] { culture });
    }
    catch { }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值