
java夏令時_java-時間處理夏令時冬令時跨時區(qū)問題處理作為?個成熟的編程語?,java?然有?堆?法來解決的時間的問題。有的時候我們會因為對java?些內(nèi)置的api不是太熟悉,對某個場景不熟悉,導致遇到了棘?的問題。?如這個場景夏令時和冬令時
夏令時和冬令時
在做全球性的功能時絕對少不了遇到時區(qū)轉(zhuǎn)化,?般情況下使?時間戳+java內(nèi)置的api就能解決99%的問題,但是如果遇到夏令時或者冬令時的時候這個問題就可能變得不是這么容易。
?先記錄?下什么是夏令時和冬令時:簡單的說在這個世界上的某些國家會規(guī)定在某個?期將本國所在的時區(qū)發(fā)?改變,然后在某個時間將他改回來,進?改變的?期就是夏令時或者冬令時
注意:這個概念深層次的東西可以???搜索引擎查找相關(guān)內(nèi)容,我這?沒有?其他?的那種解釋?如夏令時就是把表調(diào)快??時,?是使?修正時區(qū)這個概念,這么做是為了?便做下?的解釋
夏令時和冬令時產(chǎn)?的業(yè)務(wù)場景
舉個例?: ?個實?了夏令時和冬令時的國家在夏令有?個活動,每天11點到1?點參加,為期七天,?這7天正好過了令時變化的這?天, 這樣會導致什么問題呢?
因為跨過令時所以跨令時之前?天的12點20分和后?天的12點20分之間相隔的并不是24?時,因為令時的變化攜帶的時區(qū)的變化,因為時區(qū)變化了,所以相同的12點20分對應的毫秒數(shù)是不同的(毫秒沒有時區(qū)問題)
所以為期七天這個過程不能簡單使?+24?時來處理了,因為這樣就可能導致跨令時前是11點到1點,跨令時之后就是12點到2點了
怎么解決
java提供了?個?常?逼的api TimeZone ,專門?來處理時區(qū)問題
有兩個api
TimeZone itemTimeZone = TimeZone(時區(qū)名);
這樣就很簡單了,使?這兩個api如果返回的值不相等,就說明當前時間處于某?個令時中
進階?下,解決?下上?的需求,跨令時的時候保證?期是+1的
解釋?下這個需求, 直接??個最基本的例?來說
我?西班?國家的時區(qū)來做?個+24?時的天數(shù)迭代,理論上應該讓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
//跨夏令時了出現(xiàn)問題....
2019-10-27 03:00:00
2019-10-27 05:00:00
所以不能這么做,直接上代碼,其實就是?個很簡單的算法題了
public class ScopeTimeDO {
//開始時間
private Long startTime;
// 結(jié)束時間
private Long endTime;
// 循環(huán)次數(shù) , 活動持續(xù)天數(shù)
private Integer cycleCount;
}
/**
*
* @param scopeTimeDO 活動時間數(shù)據(jù)
* @param timeZeno 時區(qū)信息 ?如"Europe/Madrid"
* @return 返回活動基于持續(xù)天數(shù)構(gòu)造的毫秒時間序列
*/
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;
}
上?的算法簡單的說就是補償時差,當前的時間和之后的進??較,如果有差別就+上差距就?了 , 這樣就能保證在跨夏令時的時候保證時間統(tǒng)?