当Culture遇上DateTimeFormat

提问——如果你遇到一个其他语言都不复现,只能在芬兰语测试环境中出现的bug,你的第一反应是什么?

(冷场)

好吧,还是先说说我的亲身经历,步骤如下:首先在芬兰语Windows环境安装并配置软件;其次对某一台特定测试机发出请求。返回下图结果。

 

经过反复验证,该问题在CCJK,FR, DE上均不复现。那么在request场景中,最大的嫌犯就只能是时间格式了吧,来看看Windows的Finland Region设置。


果不其然,在芬兰语中分秒分隔符并不是我们熟悉的“:”而是“.”。再回到本例中,查看错误日志发现最初的错误源头来自于Data Serialization,另外注意到开发人员使用了Json.NET(技术细节请参见 http://www.newtonsoft.com/json)来序列化对象日期,同时并未指定culture,这样程序就会采用OS默认的culture,在本例中即芬兰语。示意代码如下:
CultureInfo culture = CultureInfo.GetCultureInfo("fi");

Product pro = new Product();
pro.Log = culture + " App Launched...";
pro.LogDate = new DateTime(2016, 8, 5, 1, 2, 3);

var converter = new IsoDateTimeConverter()
{
    Culture = culture,
    DateTimeFormat = "yyyy-MM-ddTHH:mm:ssZ"
};

string defaultJson = JsonConvert.SerializeObject(pro);
Console.WriteLine(defaultJson);

string isoJson = JsonConvert.SerializeObject(pro, converter);
Console.WriteLine(isoJson);

为了效果展示,我将culture明示为fi,DateTimeFormat也指定了pattern格式。这下应该万无一失,序列化后的时间板儿定输出2016-08-05T01:02:03Z吧?OK! 所见略同,走起。
{"Log":"fi App Launched...","LogDate":"2016-08-05T01:02:03"}
{"Log":"fi App Launched...","LogDate":"2016-08-05T01.02.03Z"}

啊哦~~~这就是生活啊!即便我们煞费苦心的指定了DateTimeFormat pattern,然而一旦遇到这种情况,终究还是根儿红苗正的culture说了算……
 
长歌当哭,是在痛定思痛之后的。这里我直接放出了InvariantCulture的大招。
CultureInfo culture = CultureInfo.InvariantCulture; 
再次运行,这个世界终于清静了。
{"Log":" App Launched...","LogDate":"2016-08-05T01:02:03"}
{"Log":" App Launched...","LogDate":"2016-08-05T01:02:03Z"}

本案中bug正是因为序列化时间日期产生了异常,导致之后的request请求异常,checkin 代码后,问题亦不再出现。那么问题来了——日后当你再次遇到仅在某一个culture或locale出现的国际化bug时,你又会想到什么呢?这就是生活?呃……好吧
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值