深入学习ing

国外服务器中在Mysql语句中当前时间直接使用C#中的Date.Now创建SQL查询结果不准的解决方案

MySql中处理字符串时间,会默认把第一个数字当成年份处理。

在C#服务器中,使用Date.Now.ToString()生成的字符串时间,如果不指定字符串格式,C#会按照系统语言输出不同的字符串格式,如:

a. 美国: 06/01/2019 01:59:00 PM

b.中国: 2019/06/01 13:59:00

 

原因分析:进过翻阅很多资料,汇总一下,发现,Date.Now默认转字符串时跟一个类有关:System.Globalization.CultureInfo提供有关特定区域性(对于非托管代码开发,则称为“区域设置”)的信息。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期和数字的格式化设置。

参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.globalization.cultureinfo?view=netframework-4.7.2

可以通过属性:System.Threading.Thread.CurrentThread.CurrentCulture 获取当前线程使用的区域语言;这里,一般国内的服务器操作系统一般都是中文Windows系统,所以使用的英文版Windows或者linus系统等,会导致线程的区域语言有区别。

而微软通过这个类,对不同系统的用户做了人性化的处理,如:对时间的显示格式存在差别。设置后对服务器代码部署到不同地区的开发者来说,便于对日期等格式的统一化管理!

 

解决方案:

1-临时修改线程中的区域语言为中文模式:

System.Threading.Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo("zh-CN");

2-使用全局配置模式:globalization节点下添加属性:culture="zh-CN" uiCulture="zh-CN"

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN" />
  </system.web>

3-Date.Now.ToString("yyyy-MM-dd HH:mm:ss") 指定日期类型,避免使用:string.format(@"{0}",Date.Now)或者Date.Now.ToString()这样的默认字符串格式。

Date.Now.ToString("yyyy-MM-dd HH:mm:ss")

4-使用Mysql自带的获取当前时间方法: now()

select now()  --获取当前时间

 

总结:需要注意的事,前面2中解决方案解决了问题根源;后2中方案只是绕过了这个问题,但是对于后来的新同学可能还会犯同样的错误,所以推荐前面两种方案,这样在写当前时间的时候,你随意怎么写。

另外像:月/日/年 小时:分   这样的时间格式,SqlServer是支持的,这里给SqlServer的强大点个赞!!!

 

备注几个本人查阅很多资料的地址,或许对大家有其他参考价值:

https://docs.microsoft.com/zh-cn/dotnet/api/system.datetime?redirectedfrom=MSDN&view=netframework-4.7.2

https://www.c-sharpcorner.com/article/datetime-in-c-sharp/

 

错误实例一:如下面的代码,在英文版的windows系统下,会导致查询数据不准:应改为:Date.Now.ToString("yyyy-MM-dd HH:mm")

/// <summary>
            /// (用户ID) => 用户优惠码可用数量
            /// </summary>
            /// <param name="userId">用户ID</param>
            /// <returns></returns>
            public static int GetCouponCount(int userId)
            {
                int count = 0;
                if (userId > 0)
                {
                    List<string> whereList = new List<string>
                    {
                        string.Format("`{0}` = '{1}'", Coupon_user_mapping._USERID_, userId),
                        string.Format("`{0}` = '{1}'", Coupon_user_mapping._STATUS_, ECoupon.Status.可用.GetValue()),
                        string.Format("`{0}` > '{1}'", Coupon_user_mapping._USEENDTIME_, DateTime.Now)
                    };
                    string where = string.Join(" AND ", whereList);
                    whereList.Clear();
                    whereList = null;
                    Coupon_user_mappingBLL.Select(where, out count);
                }
                return count;
            }

 

下面是本公司服务器时间测试截图:左侧为中文windows系统,右侧为英文版windows系统。   在设置CultureInfo区域语言后,英文的系统展示时间也可以为左侧的标准格式了。

 

posted on 2019-02-26 19:00  深入学习ing  阅读(888)  评论(1编辑  收藏  举报

导航