时间戳转格式化时间的本地化

简介

近期在研究组的项目中,开发SDK时发现一个bug,bug的具体原因是未做时间戳转时间格式的本地化,导致时间校验失败。具体问题和解决方案描述如下。

现象描述

从服务器收到的返回信息中,包括有返回信息的有效时间,使用Java版本的SDK验证有效时间通过,使用C#版本的SDK验证有效时间不通过。

Debug

分别使用Eclipse和VS对SDK中从返回信息中提取时间的代码debug,发现Java版本的SDK和C#版本的SDK提取的时间戳相同,没有问题。

但C# SDK之后对时间有效性的验证是通过比对两个Datetime的变量实现的,Java SDK直接使用时间戳进行的对比,因此怀疑C#在将时间戳转为Datetime的过程中发生了错误。

监视C# SDK中将时间戳转为Datetime后的时间,发现比当前时间早8个小时,思考了一下,发现8个小时正好是北京相对格林尼治时间的调时。

搜索了一下资料,发现确实是之前C# SDK中已有代码没有在将时间戳转为Datetime时做时间本地化,而使用DateTime.Now获取的却是本地时间,导致时间有效性验证不通过。

代码

C# (错误原版)

Datetime validTime = new DateTime(1970, 1, 1).AddSeconds(time);  // time为HTTP Response中提取出的时间戳
if(validTime < Datetime.Now)
        return false;  // 由于validTime早于真正时间8小时,总是执行该语句
else
        return true; // 该语句不会被执行

C# (正确修正版)

Datetime validTime = new DateTime(1970, 1, 1).AddSeconds(time).ToLocalTime(); //时间戳转时间后进行本地化
if(validTime < Datetime.Now)
        return false;
else
        return true;

补充

  • 高级语言中将时间戳转换为格式化时间的API中,并非都实现了对时间的本地化,因此遇到转换后的时间与预期的不同时,可以查看下时间的差值,是否因为时区问题造成;同时也要提防因为API提前做了本地化,导致转换后的时间非格林尼治时间的问题。
  • 对时间的大小对比,直接使用时间戳这一不受环境印象的因素更好(当然,具体问题具体分析,不能一概而论)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,865评论 19 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,936评论 8 265
  • 今天回想起老公的这件事,有我们还会好好的喜悦,也会不时的袭来老公真的被赶下去的恐慌和无奈。当老公被赶下去的感觉袭来...
    liangye阅读 2,795评论 0 0
  • 现在大家习惯性的将产品运营分为渠道运营,内容运营,用户运营,数据运营等等。可是我想说,其实很多公司也并没有细分到这...
    淡柳阅读 4,536评论 1 1
  • 在人海里遇见你 便再难忘记 与你相知 多幸运 偏偏喜欢你 ...
    劉翰字阅读 1,171评论 0 0

友情链接更多精彩内容