package m9z import ( "encoding/binary" "fmt" "time" ) type SunTimes struct { Sunrise time.Time // 日出时间(转换为当日时间对象) Sunset time.Time // 日落时间 RawSunrise int16 // 原始日出分钟数(从午夜开始的分钟偏移) RawSunset int16 // 原始日落分钟数 } func SunRiseTimeRead(deviceId string) (*SunTimes, error) { cmd, err := ReadCmd(deviceId, sunRiseTime, "读取日出日落时间") if err != nil { return nil, err } data := cmd.Data // 数据长度校验(至少需要4字节) if len(data) < 4 { return nil, fmt.Errorf("invalid data length: %d, expect at least 4 bytes", len(data)) } st := &SunTimes{} // 1. 解析日出时间(小端序int16) st.RawSunrise = int16(binary.LittleEndian.Uint16(data[0:2])) // 2. 解析日落时间(小端序int16) st.RawSunset = int16(binary.LittleEndian.Uint16(data[2:4])) // 转换为当日时间(假设基于UTC的当天) toDayFmt := time.Now().Format(time.DateOnly) location, _ := time.LoadLocation("Asia/Shanghai") baseTime, _ := time.ParseInLocation(time.DateOnly, toDayFmt, location) st.Sunrise = baseTime.Add(time.Duration(st.RawSunrise) * time.Minute) st.Sunset = baseTime.Add(time.Duration(st.RawSunset) * time.Minute) return st, nil }