概述
最近要做报表统计数据,前端echart展示,选择一个时间段,时间端内自由展示数据
由于我们是海外项目前端时间和后段时间是不统一的
java程序怎么换算,时间戳->>utc->>正确的时间
前端: 时间戳
java端 :全局的utc
mysql: UTC 时间存储时间戳
正常流程算时间
例如GMT+8
"2023-1-31 00:00:00" stamp 1675094400s
"2023-2-28":23:59:59 stamp 1677599999s
//设置默认时区为utc
@PostConstruct
void setDefaultTimezone() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
换算成
utc+0 2023-01-30 16:00:00
2023-02-28 15:59:59
时间戳在utc怎么换算成正确的时间
offset时间偏移量 gmt+8 等于28800000ms
获取正确时间应该是 new Date(时间戳 * 1000L+offset)
/**
* 目的根据传递 参数 获取自然年 自然月 自然周,自然天
* @param startTime 开始时间戳
* @param endTime 结束时间戳
* @param groupDate 自然天/自然周/自然季度/自然月/自然年
* @return
*/
public static List<StampAndFormatTimeDto> getDateArray(Long startTime, Long endTime, String groupDate, Integer offset) {
ArrayList<StampAndFormatTimeDto> list = new ArrayList<StampAndFormatTimeDto>();
//将时间戳转换成毫米
Long sTime = startTime * 1000L-offset;
Long etime = endTime * 1000L-offset;
Date sDateTime = new Date(sTime);
Date eDateTime = new Date(etime);
Date swap = null;
while (sDateTime.before(eDateTime)){
Calendar instance = Calendar.getInstance();
//获取是那种格式
switch (groupDate){
case "HOURS":
instance.setTime(sDateTime);
//instance.set(Calendar.HOUR_OF_DAY ,0);
instance.add(Calendar.HOUR,1);
break;
case "DAY":
instance.setTime(sDateTime);
instance.add(Calendar.DAY_OF_MONTH,1);
break;
case "WEEK":
instance.setTime(sDateTime);
instance.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//这里设置一周开始时间是星期一
instance.add(Calendar.WEEK_OF_MONTH,1);
break;
case "MONTH":
instance.setTime(sDateTime);
instance.add(Calendar.MONTH,1);
break;
case "YEAR":
instance.setTime(sDateTime);
instance.add(Calendar.YEAR,1);
break;
default:
break;
}
swap = instance.getTime();
System.out.println(swap);
//实际结尾时间大于 结束时间 则用结束时间
if (swap.after(eDateTime)){
swap = eDateTime;
}
StampAndFormatTimeDto dto = new StampAndFormatTimeDto();
dto.setStartTime((sDateTime.getTime()+offset)/1000L);
dto.setEndTime((swap.getTime()+offset)/1000L);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(swap));
dto.setStartFormat(sdf.format(sDateTime));
dto.setEndFormat(sdf.format(swap));
sDateTime = swap;
list.add(dto);
}
return list;
}
mysql用时间戳换算成我们需要的时间
from_unixtime 时间戳转时间
CONVERT_TZ转时间偏移量
date_format时间格式化 比如我们分周之类的
<select id="countExpByActive" resultType="com.zhsp.entity.dto.CountExpRespDto">
SELECT date_format(CONVERT_TZ(from_unixtime(create_time),#{utcOffset},#{diffOffset}),#{timeFormat}) as date,
count(id) as receiveNum,
avg(create_time) as create_time
FROM exp_receive
WHERE sys_tenant_id=#{expFormDto.sysTenantId} and (create_time between #{expFormDto.startTime} and
#{expFormDto.endTime})
<if test="expFormDto.stationIds.length>0">
and b_id in
<foreach collection="expFormDto.stationIds" item="item" separator="," index="index" close=")" open="(">
#{item}
</foreach>
</if>
group by date
</select>