go-fds/date.go

54 lines
978 B
Go

package fds
import (
"fmt"
)
type FdsDate struct {
Year int
Month int
Day int
}
func NewFdsDate(raw []byte) (*FdsDate, error) {
if len(raw) != 3 {
return nil, fmt.Errorf("Must be three bytes")
}
if raw[1] == 0x00 || raw[1] > 0x12 || (raw[1] > 0x09 && raw[1] < 0x10) {
return nil, fmt.Errorf("Invalid month: %02X", raw[1])
}
if raw[2] == 0x00 || raw[2] > 0x31 ||
(raw[2] > 0x09 && raw[2] < 0x10) ||
(raw[2] > 0x19 && raw[2] < 0x20) ||
(raw[2] > 0x29 && raw[2] < 0x30) {
return nil, fmt.Errorf("Invalid day: %02X", raw[1])
}
return &FdsDate{
Year: bcdToDec(raw[0]),
Month: bcdToDec(raw[1]),
Day: bcdToDec(raw[2]),
}, nil
}
func bcdToDec(val byte) int {
v := int(val)
return (v>>4)*10 + (v&0x0F)
}
func (date *FdsDate) String() string {
return fmt.Sprintf("Years: %04d/%04d/%04d Month: %d Day: %d",
date.Year+1926,
date.Year+1989,
date.Year+1900,
date.Month,
date.Day,
)
}
//func (date *FdsDate) Raw() []byte {
//}