由于是东南亚客户他们日期格式都不一样不像国内大部分都是yyyy-MM-dd,现在搜索项目中前后台共有4000多个对日期进行格式化的地方,无从下手啊。。。求个统一日期格式化的方案。
日期格式统一(需要考虑日期、时间两种;读取的sql中是否有格式化日期,读取的程序中是否有格式化日期;在读写时根据配置的格式进行转换,需要注意配置的格式在当前数据库是否支持)。
我认为格式化主要涉及两部分,1.因为没有用时间戳,存入SQL时的格式,如果SQL设置的语言和日期格式不匹配是存不进去的;2.读出时,web页面展现给用户看的日期格式处理。
系统现存的在后台文件和js文件中都有做日期格式化的地方,而且目前看下来使用的格式化方法还都不一样,要是一个一个改的话就很烦了。。。。
建议针对时间写扩展方法。4000多个,搜索替换也不多。。还有,项目有跨时区的时候,建议使用long来存取长整型时间。
1.确定日期格式的种类,如格式1,2,3,4,5...
2.给相应的种类写正则表达式,并捕捉日期、时间
3.根据捕捉到的数据格式化你想到的格式。
建议直接写程序,不建议写sql,特别是T-SQL 对正则基本不支持 .
正则教程推荐:
http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
感谢回复,如果要捕捉是在什么地方什么时间捕捉呢?能具体讲一下吗?
@JOKERORHERO: 把你的格式发上来
@段隆贤: 数据库中存的DATETIME类型,希望是能根据不同客户配置的,有的dd-MM-yyyy,有的dd/MMM/yyyy。
@JOKERORHERO:
(\d{2})-(\d{2})-(\d{4})
(\d{2})/(\d{3})/(\d{4})
写一个存储过程,输入你的各式各样的参数,然后通过各种时间规则进行特定的时间转换就可以实现了
适配器模式很适合你使用
@刘宏玺: 好的,感谢,我去学习一下。
这个只能用正则表达式匹配啊。或者高级一点你可以用遗传算法或者模式匹配,就是给程序几个输入,让它自己学会如何匹配日期。
不论是US的mm/dd/yyyy 还是日本的yy/mm/dd还是意大利的dd-mm-yy还是德国的dd.mm.yy还是ISO的yymmdd等等等等这些。
都可以用sql server的非常强大的日期格式化CONVERT(varchar(100), 日期时间, XXX)函数啊。 sql 全球化的, 你可以完美利用它。
如果还要自定义, 可以写个函数或存储过程, 要格式的地方通通调用就行。
这得看你存储在什么数据库中,使用什么类型的字段。
一般如果使用DATETIME类型的字段,实际上是只有一个数值的。只是在不同区域的电脑上看到不同格式的日期。
现在数据库中存的DATETIME类型,但现在很多地方都用了.ToString("yyyy-MM-dd"),而这个格式还不是一个出处,真的只能每个地方挨个改了吗?
@JOKERORHERO:
我的看法是这样的,如果你这个系统真的有七八十国家,不同文化的人在使用的话。
修改日期预算个十来万我觉得也是正常的,不要低估这件事情。
你想想如果是老赵,每个月工资十多万,为这个出一个解决方案,而且要稳妥,然后还要可实施,验证效果,一个月我觉得也是正常的。
当然,预算紧张一点,成本控制严格一些,三五万也是能解决的。
如果你本身系统就是一个垃圾系统,到处写tostring的,那你就用最垃圾的方法解决,可能三五千也就解决了,下次出问题,反正就不是你了。
等我死后,哪管洪水涛天。
这也是为什么同样功能的系统,五万也在开发,五十万也在开发,五百万也在开发。(不考虑贪污成本等相关问题,纯技术论)
@爱编程的大叔: 我只想就目前的情况而言,做到最好的方式去处理,所以前来学习的。不关乎这个事情投入多少成本,不关乎前人如何做,后人如何看。
@JOKERORHERO:
1、整理出所有不同国家的日期格式列表,确认你所有的用户都在这个列表中。
2、研究所有这些格式,看看是要强制要求所有用户使用一种格式,还是尊重每个人每个国家的不同使用习惯。
3、使用微软Globalization中有关Localize相关的一些函数,而不是使用TOSTRING,
确保每个与日期有关的显示及编辑数据方面,统一使用一个日期处理函数。这个函数由你综合考虑各个国家的情况,实在不行的话就SELECT CASE,最笨的方法也许是有效的方法。
4、整理所有的日期格式,找出软件里面,所有使用日期的函数,整理出几种不同的用法。
可能有的控件对日期格式的支持还不一样。
5、安装测试环境,在开发转换日期格式函数这事情上,进行测试,最好进行严格的覆盖测试,也就是说你的电脑要模拟出所有国家的环境。这个可以用VMWARE+安装各国不同的操作系统来进行。(最保险),次之的解决方案是在控制面板中进行修改。
6、严格按照我这上面说的逻辑,大概安排个3、5个人,搞个把月,应该有可能把95%以上的问题都测试出来,然后再列出所有的问题,问题清楚了,一般就可以解决的。
@爱编程的大叔: 感谢耐心的答复,使用Globalization中有关Localize的一些函数,能举个简单的例子吗?是将一个个日期格式存在资源文件中吗?
@JOKERORHERO: 不是的,大概的用法是
Datetime.toString可以指定按照某个国家的格式输出,你看看那些个函数的重载,里面有个参数是指定CultureInfo的。(CultureInfo是用来控制货币、日期、时间等格式的默认显示)
1、数据库存储时间如果存储的是datetime格式的,其实存储的是一个long型的数值,不用考虑在不同的数据库管理工具中显示的时间样式,那只是显示效果而已。
2、建议系统里面的都采用DateTime格式传递时间,只有在显示的时候才采用标准时间输出,这样很容易就可以直接转回时间值。
示例:
static void Main(string[] args) { DateTime now = DateTime.Now; Console.WriteLine(now.ToString(System.Globalization.CultureInfo.CurrentCulture)); string longDate = now.ToLongDateString(); Console.WriteLine(longDate); DateTime ld = DateTime.Parse(longDate, null, System.Globalization.DateTimeStyles.RoundtripKind); Console.WriteLine(ld.ToShortDateString()); Console.ReadKey(); }
输出结果:
2014/12/31 10:46:56 2014年12月31日 2014/12/31
参考链接:
http://www.cnblogs.com/lucienbao/archive/2013/05/09/DateTime_TryParseExact.html
http://www.cnblogs.com/lucienbao/archive/2013/03/26/DateTimeParse.html