From bcf7df31da3b5933393dd59bf95359400ca5d973 Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 15 May 2025 16:44:38 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=98=BE=E7=A4=BA=E6=97=B6=E9=97=B4=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dao/sensor.go | 13 +++++++++---- internal/handler/sensor.go | 9 ++++++++- static/index.html | 34 +++++++++++++++------------------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index 98bc5d6..c07dc4c 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -47,7 +47,7 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( case "5min": query = ` SELECT - MIN(timestamp) as ts, + DATE_FORMAT(timestamp, '%Y-%m-%dT%H:%i:%s') as ts, ROUND(AVG(temperature)/10, 1) as avg_temp, MAX(rainfall) - MIN(rainfall) as rainfall, ROUND(AVG(humidity)/10, 1) as avg_humidity, @@ -60,7 +60,7 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( case "30min": query = ` SELECT - MIN(timestamp) as ts, + DATE_FORMAT(timestamp, '%Y-%m-%dT%H:%i:%s') as ts, ROUND(AVG(temperature)/10, 1) as avg_temp, MAX(rainfall) - MIN(rainfall) as rainfall, ROUND(AVG(humidity)/10, 1) as avg_humidity, @@ -73,7 +73,7 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( default: // 1hour query = ` SELECT - MIN(timestamp) as ts, + DATE_FORMAT(timestamp, '%Y-%m-%dT%H:%i:%s') as ts, ROUND(AVG(temperature)/10, 1) as avg_temp, MAX(rainfall) - MIN(rainfall) as rainfall, ROUND(AVG(humidity)/10, 1) as avg_humidity, @@ -102,7 +102,12 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( logger.Logger.Printf("扫描数据行失败: %v", err) continue } - data.Timestamp, _ = time.Parse("2006-01-02 15:04:05", tsStr) + // 解析ISO格式的时间字符串 + data.Timestamp, err = time.Parse("2006-01-02T15:04:05", tsStr) + if err != nil { + logger.Logger.Printf("解析时间失败: %v", err) + continue + } result = append(result, data) } diff --git a/internal/handler/sensor.go b/internal/handler/sensor.go index 5df1edb..4a3dfc4 100644 --- a/internal/handler/sensor.go +++ b/internal/handler/sensor.go @@ -45,7 +45,14 @@ func (h *SensorHandler) GetAggregatedData(w http.ResponseWriter, r *http.Request } w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(data) + // 使用自定义的编码器,设置时间格式 + encoder := json.NewEncoder(w) + encoder.SetIndent("", " ") + if err := encoder.Encode(data); err != nil { + logger.Logger.Printf("JSON编码失败: %v", err) + http.Error(w, "服务器内部错误", http.StatusInternalServerError) + return + } } // 处理静态文件 diff --git a/static/index.html b/static/index.html index feb5558..f7882b8 100644 --- a/static/index.html +++ b/static/index.html @@ -213,17 +213,15 @@ } const labels = data.map(item => { - // 确保使用正确的时间格式解析 - const date = new Date(item.timestamp.replace(' ', 'T') + 'Z'); - // 调整为本地时间 - const localDate = new Date(date.getTime() + (8 * 60 * 60 * 1000)); + // 直接解析ISO格式的时间字符串 + const date = new Date(item.timestamp); // 格式化为中文日期时间格式 - return localDate.getFullYear() + '/' + - (localDate.getMonth() + 1).toString().padStart(2, '0') + '/' + - localDate.getDate().toString().padStart(2, '0') + ' ' + - localDate.getHours().toString().padStart(2, '0') + ':' + - localDate.getMinutes().toString().padStart(2, '0'); + return date.getFullYear() + '/' + + (date.getMonth() + 1).toString().padStart(2, '0') + '/' + + date.getDate().toString().padStart(2, '0') + ' ' + + date.getHours().toString().padStart(2, '0') + ':' + + date.getMinutes().toString().padStart(2, '0'); }); mainChart = new Chart(ctx, { @@ -288,18 +286,16 @@ data.forEach(item => { const row = document.createElement('tr'); - // 确保使用正确的时间格式解析 - const date = new Date(item.timestamp.replace(' ', 'T') + 'Z'); - // 调整为本地时间 - const localDate = new Date(date.getTime() + (8 * 60 * 60 * 1000)); + // 直接解析ISO格式的时间字符串 + const date = new Date(item.timestamp); const formattedDate = - localDate.getFullYear() + '/' + - (localDate.getMonth() + 1).toString().padStart(2, '0') + '/' + - localDate.getDate().toString().padStart(2, '0') + ' ' + - localDate.getHours().toString().padStart(2, '0') + ':' + - localDate.getMinutes().toString().padStart(2, '0') + ':' + - localDate.getSeconds().toString().padStart(2, '0'); + date.getFullYear() + '/' + + (date.getMonth() + 1).toString().padStart(2, '0') + '/' + + date.getDate().toString().padStart(2, '0') + ' ' + + date.getHours().toString().padStart(2, '0') + ':' + + date.getMinutes().toString().padStart(2, '0') + ':' + + date.getSeconds().toString().padStart(2, '0'); row.innerHTML = ` ${formattedDate}