java夏令时_java-时间处理夏令时冬令时跨时区问题处理

更新时间:2023-06-11 08:25:12 阅读: 评论:0

java夏令时_java-时间处理夏令时冬令时跨时区问题处理作为⼀个成熟的编程语⾔,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(时区名);
这样就很简单了,使⽤这两个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:00
long startTime = 1572055200000L;
//2019-10-26 06:00:00
long endTime = 1572062400000L;
SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone timeZone = TimeZone("Europe/Madrid");
bjSdf.tTimeZone(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 = StartTime();
long endTime = EndTime();
int cycleCount = CycleCount();
int speed = 0;
TimeZone itemTimeZone = TimeZone(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;
}el{
long[] last = (timeList.size()-1);
long beforeStartP = Offt(last[0]);
long beforeEndP = Offt(last[1]);
item[0] = last[0]+DAY;
item[1] = last[1]+DAY;
long nowStartP = Offt(item[0]);
long nowEndP = Offt(item[1]);
item[0] = item[0] + (beforeStartP-nowStartP);
item[1] = item[1] + (beforeEndP-nowEndP);
}
cycleCount--;
timeList.add(item);
}
return timeList;
}
上⾯的算法简单的说就是补偿时差,当前的时间和之后的进⾏⽐较,如果有差别就+上差距就⾏了 , 这样就能保证在跨夏令时的时候保证时间统⼀

本文发布于:2023-06-11 08:25:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1686443112224615.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java夏令时_java-时间处理夏令时冬令时跨时区问题处理.doc

本文 PDF 下载地址:java夏令时_java-时间处理夏令时冬令时跨时区问题处理.pdf

标签:时间   问题   时区   冬令   时候
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|