作为一个成熟的编程语言,java自然有一堆方法来解决的时间的问题。有的时候我们会因为对java一些内置的api不是太熟悉,对某个场景不熟悉,导致遇到了棘手的问题。比如这个场景夏令时和冬令时

夏令时和冬令时

在做全球性的功能时绝对少不了遇到时区转化,一般情况下使用时间戳+java内置的api就能解决99%的问题,但是如果遇到夏令时或者冬令时的时候这个问题就可能变得不是这么容易。首先记录一下什么是夏令时和冬令时:简单的说在这个世界上的某些国家会规定在某个日期将本国所在的时区发生改变,然后在某个时间将他改回来,进行改变的日期就是夏令时或者冬令时

注意:这个概念深层次的东西可以自行用搜索引擎查找相关内容,我这里没有用其他人的那种解释比如夏令时就是把表调快一小时,而是使用修正时区这个概念,这么做是为了方便做下面的解释

夏令时和冬令时产生的业务场景

举个例子: 一个实行了夏令时和冬令时的国家在夏令有一个活动,每天11点到1一点参加,为期七天,而这7天正好过了令时变化的这一天, 这样会导致什么问题呢?

因为跨过令时所以跨令时之前一天的12点20分和后一天的12点20分之间相隔的并不是24小时,因为令时的变化携带的时区的变化,因为时区变化了,所以相同的12点20分对应的毫秒数是不同的(毫秒没有时区问题) 所以为期七天这个过程不能简单使用+24小时来处理了,因为这样就可能导致跨令时前是11点到1点,跨令时之后就是12点到2点了

怎么解决

java提供了一个非常牛逼的api TimeZone ,专门用来处理时区问题

有两个api

TimeZone itemTimeZone = TimeZone.getTimeZone(时区名);

itemTimeZone.getOffset(long data);//显示当前时区和0时区的偏移量,和令时制相关itemTimeZone.getRawOffset();//显示当前时区和0时区的偏移量,和令时制无关

这样就很简单了,使用这两个api如果返回的值不相等,就说明当前时间处于某一个令时中

进阶一下,解决一下上面的需求,跨令时的时候保证日期是+1的

解释一下这个需求, 直接用一个最基本的例子来说

我用西班牙国家的时区来做一个+24小时的天数迭代,理论上应该让2019-10-26 4点和6点,变成2019-10-27 4点和6点 但是应为夏令时的问题,其实变成的是成2019-10-27 3点和5点

跑一下下面的代码

long oneData = 24*60*60*1000;

//2019-10-26 04:00:00long startTime = 1572055200000L;

//2019-10-26 06:00:00long endTime = 1572062400000L;

SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

TimeZone timeZone = TimeZone.getTimeZone("Europe/Madrid");

bjSdf.setTimeZone(timeZone);

System.out.println(bjSdf.format(new Date(startTime)));

System.out.println(bjSdf.format(new Date(endTime)));

System.out.println(bjSdf.format(new Date(startTime+oneData)));

System.out.println(bjSdf.format(new Date(endTime+oneData)));

输出:

2019-10-26 04:00:00

2019-10-26 06:00:00

//跨夏令时了出现问题....

2019-10-27 03:00:00

2019-10-27 05:00:00

所以不能这么做,直接上代码,其实就是一个很简单的算法题了

public class ScopeTimeDO {

//开始时间 private Long startTime;

// 结束时间 private Long endTime;

// 循环次数 , 活动持续天数 private Integer cycleCount;

}

/**** @param scopeTimeDO 活动时间数据* @param timeZeno 时区信息 比如"Europe/Madrid"* @return 返回活动基于持续天数构造的毫秒时间序列*/

public List createTimeInterval(ScopeTimeDO scopeTimeDO,String timeZeno) {

long startTime = scopeTimeDO.getStartTime();

long endTime = scopeTimeDO.getEndTime();

int cycleCount = scopeTimeDO.getCycleCount();

int speed = 0;

TimeZone itemTimeZone = TimeZone.getTimeZone(timeZeno);

List timeList = new ArrayList<>();

while (cycleCount >=TIME_SCOPE_CYCLE_COUNT_DEFAULT_VALUE) {

long[] item = new long[2];

if(speed==0){

item[0] = startTime;

item[1] = endTime;

speed = 1;

}else{

long[] last = timeList.get(timeList.size()-1);

long beforeStartP = itemTimeZone.getOffset(last[0]);

long beforeEndP = itemTimeZone.getOffset(last[1]);

item[0] = last[0]+DAY;

item[1] = last[1]+DAY;

long nowStartP = itemTimeZone.getOffset(item[0]);

long nowEndP = itemTimeZone.getOffset(item[1]);

item[0] = item[0] + (beforeStartP-nowStartP);

item[1] = item[1] + (beforeEndP-nowEndP);

}

cycleCount--;

timeList.add(item);

}

return timeList;

}

上面的算法简单的说就是补偿时差,当前的时间和之后的进行比较,如果有差别就+上差距就行了 , 这样就能保证在跨夏令时的时候保证时间统一

冬令时 java_java-时间处理夏令时冬令时跨时区问题处理相关推荐

  1. UTC时间,GMT时间与夏令时冬令时详解

    转自:http://www.trader007.net/gmt-time-format-details/ 在我们交易时,特别是用的外盘是,经常会看到我们的系统时间与平台上的时间不一样,比如,我现在做的 ...

  2. 冬令时 java_java处理 夏令时、冬令时问题

    最近接到一个需求: 给一个在美国洛杉矶时区(America/Los_Angeles)的机器上生成的long的时间,要在中国时区的机器上,把这个时间转换成美国时间? 业务方提醒,需要特别主要夏令时.冬令 ...

  3. java时区转换 夏令时_实现时区的转换--涉及到冬令时和夏令时的时候

    #时区转换 主要是用来转换时区用的,特别涉及到冬令时和夏令时的区域,这样会很烦,所以需要用个方法来转换 这个主要是创建一些模型 using System; using System.Collectio ...

  4. mysql 时区 , 夏令时,冬令时

    mysql默认时区: mysql> show variables like '%time_zone%';+------------------+--------+ | Variable_name ...

  5. 格林威治时间、世界时、祖鲁时间、GMT、UTC、跨时区、夏令时傻傻分不清楚, 快到碗里来

    格林威治时间.世界时.祖鲁时间.GMT.UTC.跨时区.夏令时

  6. 时区、时间、夏令时及NTP时间同步设置

    1. 时区设置 1.1 Timezone文件 ls -F /usr/share/zoneinfo 1.2 Timezone Details zdump Asia/Shanghai 1.3 设置time ...

  7. php 跨区域,PHP跨时区的功能实现

    现在有一个跨时区的应用,不同时区登录的用户需要看到自己时区的时间,同时也要能够进行时区的切换. 我的思路是,系统中所有存储的时间都是GMT(UTC)时间,用户登录时,根据用户所在的时区进行对应的显示. ...

  8. 一场惊天跨国跨时区作弊案,除了需要爆表智商,还需要啥?

    在21世纪的今天,我们的生活已然离不开科技的支撑,不论哪个方面,近代科技的发展都给人们带来了诸多便利.大到航空卫星,带我们探索了众多未知事物:小到我们的日常,手机电脑等高端数码产品都充实了生活,在此基 ...

  9. android自动更新nitz,手机时间、夏令时及Android时间更新方式

    一.时间 时间是指世界的时间,是对某一时刻的表示.手机系统的时间,通常是在状态栏.锁屏界面等表现给用户,让用户知道现在是什么时间.时间分为标准时间和夏令时时间,标准时间是指正常的时间,夏令时是指满足特 ...

  10. UNIX时间和夏令时计算

    UNIX时间和夏令时 工作笔记 工作笔记 UTC和GMT gmt和utc都是标准时间.  GMT是比较古老的时间较量标准,根据地球公转自转计算时间.UTC则是根据原子钟来计算时间,现在基本都用UTC时 ...

最新文章

  1. oracle 开始一个事务,oracle的启动与关闭原理-事务commit或者rollback
  2. git idea 可视化_那些你应该知道的,但是你一定不知道的 Git 骚操作
  3. python基础语法手册format-python的格式化输出(format,%)实例详解
  4. ElementUI中el-upload中怎样限制上传文件的格式
  5. Spring dataSource配置
  6. 流程平台:示例流程 - 主机申请审批流程
  7. html自动播放音乐
  8. python数据清洗工具、方法、过程整理归纳(六、数据清洗之数据预处理(一)——重复值处理、缺失值处理)
  9. data backup vs archiving
  10. vue 微信公众号定位+高德地图
  11. html怎么修改版权信息,微擎修改免费版标题、logo、页脚版权信息教程(仅供学习)...
  12. kafka身份认证 maxwell_Kafka 使用SASL / SCRAM进行身份验证
  13. ROS 2行动-actions-
  14. MYSQL全文索引及Match() against()踩坑记录-超详细超实用
  15. 2019/08/09 zookeeper基础概念(01)
  16. 【go实战系列五】 go1.19.2与pkg中error如何wrap与unwrap Errors | 将error进行wrap向上处理思想 | pkg/errors
  17. XmlPullParserException: unexpected character in markup
  18. 摸鱼kik,RSS+即刻的结合APP?
  19. PyQt5简易入门指南03,使用资源文件和设计师
  20. 华为大数据的创新之路

热门文章

  1. 视频结构化技术应用的必要性
  2. “征信污点”可消除?征信中心:不可能
  3. enfuzion与lsf构建渲染集群_渲染农场 - 秦瑞It行程实录 - 博客园
  4. winHex数据恢复(第一篇)
  5. QT应用编程: 获取系统当前时间以及1970到现在的总秒数
  6. 秒杀项目的总结及面试常见问题
  7. js 区分中英文输入法(如中英文括号)
  8. OpenERP中商品销售的处理及案例解析
  9. 计算机图形学:二维基本几何变换——对称
  10. 穿上就不想脱下!这款火爆ins的夏季凉鞋,防滑,抗污,速干不臭脚!让你秒变型男!...