java+mysql统计年 月 周 天 小时处理时间

1 篇文章 0 订阅
1 篇文章 0 订阅

概述

最近要做报表统计数据,前端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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值