54 lines
978 B
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 {
|
|
//}
|