blob: 8b1106dd84efe50bc613a0d05ff49ba2b7830331 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package model
import (
"encoding/json"
"math"
"strconv"
"strings"
"time"
"airlines/pkg/airports"
)
type Sex uint8
const (
SexUnknown Sex = 0
SexMale Sex = 1
SexFemale Sex = 2
)
func (s *Sex) UnmarshalJSON(b []byte) error {
var raw string
if err := json.Unmarshal(b, &raw); err == nil {
switch strings.ToLower(strings.TrimSpace(raw)) {
case "male":
*s = SexMale
return nil
case "female":
*s = SexFemale
return nil
case "", "unknown", "null":
*s = SexUnknown
return nil
}
}
var n int
if err := json.Unmarshal(b, &n); err == nil {
*s = Sex(n)
return nil
}
*s = SexUnknown
return nil
}
func TzFromAirportRecord(a airports.Airport) *time.Location {
return TzFromOffsetHours(a.Timezone)
}
func TzFromOffsetHours(hours float64) *time.Location {
minTotal := int(math.Round(hours * 60.0))
sec := minTotal * 60
name := fixedZoneNameFromMinutes(minTotal)
return time.FixedZone(name, sec)
}
func fixedZoneNameFromMinutes(minTotal int) string {
sign := "+"
if minTotal < 0 {
sign = "-"
minTotal = -minTotal
}
h := minTotal / 60
m := minTotal % 60
return "UTC" + sign + two(h) + ":" + two(m)
}
func two(x int) string {
if x < 10 {
return "0" + strconv.Itoa(x)
}
return strconv.Itoa(x)
}
|