您好,登录后才能下订单哦!
最近开发碰到一个关于DateTime转换的业务,几个系统的区域语言(CultureInfo)设置都不一致,位置是控制面板-时钟、语言区域-更改日期、时间和数字格式。
线上服务器 en-GB
开发环境 zh-CN
测试服务器 en-US
代码主要涉及两个方法DateTime.ToString()和DateTime.Parse(string),如果各种转换都在同一个application上跑基本是不会有问题,比如:
var d = DateTime.Parse("2013-03-11 00:56:20"); var dStr = d.ToString(); var dNew = DateTime.Parse(dStr);
这样的代码能完全正常的,现在的场景会涉及到一个Console exe(简称A)和IIS上一个Web Service(简称B),麻烦就出现了。
A的CultureInfo默认是读取系统配置,在A中执行
var d = DateTime.Parse("2013-03-11 00:56:20"); var dStr = d.ToString();
三个环境的dStr都不一致
en-GB 11/03/2013 00:56:20
zh-CN 2013/3/11 00:56:20
en-US 11/3/2013 0:56:20 AM
接下去将dStr传入B,在B中执行
var dNew = DateTime.Parse(dStr);
这时候会发现DateTime.Parse无法识别dStr,这是因为IIS本身有自己默认的CultureInfo设置CultureInfo.InvariantCulture,这个默认配置并不区分en-GB还哦zh-CN等,所以几乎无法识别与CultureInfo有关的日期格式。
解决方案:
1. 设置IIS的CultureInfo为对应值,或者给DateTime.Parse指定对应的CultureInfo,这个方法弊端很大,因为Web Service本身是提供服务给客户端的,如果限制了一个CultureInfo,对来自各个区域的客户端是不公平的,例如设置成zh-CN,我想英国的客户端会疯掉;
2. IIS保持CultureInfo.InvariantCulture默认配置,那么只好设置客户端的CultureInfo,直接也指定成CultureInfo.InvariantCulture,大家都公平就最好了;
总之就是让大家的CultureInfo都一致,不要随便在DateTime.Parse指定CultureInfo我觉得是最好的实践,除非你无法控制dStr的来源格式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。