首页 新闻 会员 周边 捐助

求统一日期格式化解决方案

0
悬赏园豆:200 [已解决问题] 解决于 2015-01-04 10:18

由于是东南亚客户他们日期格式都不一样不像国内大部分都是yyyy-MM-dd,现在搜索项目中前后台共有4000多个对日期进行格式化的地方,无从下手啊。。。求个统一日期格式化的方案。

日期格式统一(需要考虑日期、时间两种;读取的sql中是否有格式化日期,读取的程序中是否有格式化日期;在读写时根据配置的格式进行转换,需要注意配置的格式在当前数据库是否支持)。

问题补充:

我认为格式化主要涉及两部分,1.因为没有用时间戳,存入SQL时的格式,如果SQL设置的语言和日期格式不匹配是存不进去的;2.读出时,web页面展现给用户看的日期格式处理。

系统现存的在后台文件和js文件中都有做日期格式化的地方,而且目前看下来使用的格式化方法还都不一样,要是一个一个改的话就很烦了。。。。

JOKERORHERO的主页 JOKERORHERO | 初学一级 | 园豆:22
提问于:2014-12-29 18:54
< >
分享
最佳答案
0

建议针对时间写扩展方法。4000多个,搜索替换也不多。。还有,项目有跨时区的时候,建议使用long来存取长整型时间。

收获园豆:140
幻天芒 | 高人七级 |园豆:37205 | 2014-12-30 09:04
其他回答(6)
0

1.确定日期格式的种类,如格式1,2,3,4,5...

2.给相应的种类写正则表达式,并捕捉日期、时间

3.根据捕捉到的数据格式化你想到的格式。

建议直接写程序,不建议写sql,特别是T-SQL 对正则基本不支持 .

 

正则教程推荐:

http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html

 

收获园豆:10
路西恩 | 园豆:371 (菜鸟二级) | 2014-12-29 19:46

感谢回复,如果要捕捉是在什么地方什么时间捕捉呢?能具体讲一下吗?

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 09:24

@JOKERORHERO: 把你的格式发上来

支持(0) 反对(0) 路西恩 | 园豆:371 (菜鸟二级) | 2014-12-30 10:23

@段隆贤: 数据库中存的DATETIME类型,希望是能根据不同客户配置的,有的dd-MM-yyyy,有的dd/MMM/yyyy。

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 10:50

@JOKERORHERO: 

(\d{2})-(\d{2})-(\d{4})

 

(\d{2})/(\d{3})/(\d{4})

支持(0) 反对(0) 路西恩 | 园豆:371 (菜鸟二级) | 2014-12-30 11:17
0

写一个存储过程,输入你的各式各样的参数,然后通过各种时间规则进行特定的时间转换就可以实现了

收获园豆:10
刘宏玺 | 园豆:14020 (专家六级) | 2014-12-29 20:49

适配器模式很适合你使用

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2014-12-30 10:26

@刘宏玺: 好的,感谢,我去学习一下。

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 11:20
0

这个只能用正则表达式匹配啊。或者高级一点你可以用遗传算法或者模式匹配,就是给程序几个输入,让它自己学会如何匹配日期。

收获园豆:10
Slark.NET | 园豆:692 (小虾三级) | 2014-12-29 21:44
0

不论是US的mm/dd/yyyy 还是日本的yy/mm/dd还是意大利的dd-mm-yy还是德国的dd.mm.yy还是ISO的yymmdd等等等等这些。 

都可以用sql server的非常强大的日期格式化CONVERT(varchar(100), 日期时间, XXX)函数啊。  sql 全球化的, 你可以完美利用它。

如果还要自定义, 可以写个函数或存储过程, 要格式的地方通通调用就行。 

收获园豆:10
问天何必 | 园豆:3311 (老鸟四级) | 2014-12-30 09:04
0

这得看你存储在什么数据库中,使用什么类型的字段。

一般如果使用DATETIME类型的字段,实际上是只有一个数值的。只是在不同区域的电脑上看到不同格式的日期。

收获园豆:10
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-30 09:57

现在数据库中存的DATETIME类型,但现在很多地方都用了.ToString("yyyy-MM-dd"),而这个格式还不是一个出处,真的只能每个地方挨个改了吗?

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 10:57

@JOKERORHERO: 

我的看法是这样的,如果你这个系统真的有七八十国家,不同文化的人在使用的话。

修改日期预算个十来万我觉得也是正常的,不要低估这件事情。

你想想如果是老赵,每个月工资十多万,为这个出一个解决方案,而且要稳妥,然后还要可实施,验证效果,一个月我觉得也是正常的。

当然,预算紧张一点,成本控制严格一些,三五万也是能解决的。

如果你本身系统就是一个垃圾系统,到处写tostring的,那你就用最垃圾的方法解决,可能三五千也就解决了,下次出问题,反正就不是你了。

等我死后,哪管洪水涛天。

这也是为什么同样功能的系统,五万也在开发,五十万也在开发,五百万也在开发。(不考虑贪污成本等相关问题,纯技术论)

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-30 11:06

@爱编程的大叔: 我只想就目前的情况而言,做到最好的方式去处理,所以前来学习的。不关乎这个事情投入多少成本,不关乎前人如何做,后人如何看。

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 11:24

@JOKERORHERO: 

1、整理出所有不同国家的日期格式列表,确认你所有的用户都在这个列表中。

2、研究所有这些格式,看看是要强制要求所有用户使用一种格式,还是尊重每个人每个国家的不同使用习惯。

3、使用微软Globalization中有关Localize相关的一些函数,而不是使用TOSTRING,

确保每个与日期有关的显示及编辑数据方面,统一使用一个日期处理函数。这个函数由你综合考虑各个国家的情况,实在不行的话就SELECT CASE,最笨的方法也许是有效的方法。

4、整理所有的日期格式,找出软件里面,所有使用日期的函数,整理出几种不同的用法。

可能有的控件对日期格式的支持还不一样。

5、安装测试环境,在开发转换日期格式函数这事情上,进行测试,最好进行严格的覆盖测试,也就是说你的电脑要模拟出所有国家的环境。这个可以用VMWARE+安装各国不同的操作系统来进行。(最保险),次之的解决方案是在控制面板中进行修改。

6、严格按照我这上面说的逻辑,大概安排个3、5个人,搞个把月,应该有可能把95%以上的问题都测试出来,然后再列出所有的问题,问题清楚了,一般就可以解决的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-30 11:42

@爱编程的大叔: 感谢耐心的答复,使用Globalization中有关Localize的一些函数,能举个简单的例子吗?是将一个个日期格式存在资源文件中吗?

支持(0) 反对(0) JOKERORHERO | 园豆:22 (初学一级) | 2014-12-30 14:19

@JOKERORHERO: 不是的,大概的用法是

Datetime.toString可以指定按照某个国家的格式输出,你看看那些个函数的重载,里面有个参数是指定CultureInfo的。(CultureInfo是用来控制货币、日期、时间等格式的默认显示)

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-30 14:23
0

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

收获园豆:10
Lucien.Bao | 园豆:207 (菜鸟二级) | 2014-12-31 10:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册