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}