github.com/simpleiot/simpleiot@v0.18.3/frontend/src/Utils/Time.elm (about) 1 module Utils.Time exposing (Schedule, scheduleToLocal, scheduleToUTC, toLocal, toUTC) 2 3 import Date 4 import TypedTime exposing (TypedTime) 5 6 7 toLocal : Int -> String -> String 8 toLocal offset t = 9 Maybe.withDefault 10 (TypedTime.minutes 0) 11 (TypedTime.fromString TypedTime.Minutes t) 12 |> TypedTime.add (TypedTime.minutes <| toFloat offset) 13 |> normalizeTypedTime 14 |> TypedTime.toString TypedTime.Minutes 15 16 17 toLocalWkdayOffset : Int -> String -> ( String, Int ) 18 toLocalWkdayOffset offset t = 19 let 20 tUTC = 21 Maybe.withDefault 22 (TypedTime.minutes 0) 23 (TypedTime.fromString TypedTime.Minutes t) 24 25 tLocal = 26 tUTC 27 |> TypedTime.add (TypedTime.minutes <| toFloat offset) 28 |> normalizeTypedTime 29 30 wkdayOffset = 31 if offset > 0 then 32 if TypedTime.lt tLocal tUTC then 33 1 34 35 else 36 0 37 38 else if TypedTime.gt tLocal tUTC then 39 -1 40 41 else 42 0 43 in 44 ( tLocal 45 |> TypedTime.toString TypedTime.Minutes 46 , wkdayOffset 47 ) 48 49 50 toUTC : Int -> String -> String 51 toUTC offset t = 52 Maybe.withDefault 53 (TypedTime.minutes 0) 54 (TypedTime.fromString TypedTime.Minutes t) 55 |> TypedTime.add (TypedTime.minutes <| negate <| toFloat offset) 56 |> normalizeTypedTime 57 |> TypedTime.toString TypedTime.Minutes 58 59 60 normalizeTypedTime : TypedTime -> TypedTime 61 normalizeTypedTime t = 62 if TypedTime.lt t (TypedTime.hours 0) then 63 TypedTime.add t (TypedTime.hours 24) 64 65 else if TypedTime.gte t (TypedTime.hours 24) then 66 TypedTime.sub t (TypedTime.hours 24) 67 68 else 69 t 70 71 72 type alias Schedule = 73 { startTime : String 74 , endTime : String 75 , weekdays : List Int 76 , dates : List String 77 , dateCount : Int 78 } 79 80 81 scheduleToLocal : Int -> Schedule -> Schedule 82 scheduleToLocal offset s = 83 let 84 ( startTime, wkoff ) = 85 toLocalWkdayOffset offset s.startTime 86 87 weekdays = 88 List.map (applyWkdayOffset wkoff) s.weekdays |> List.sort 89 90 dates = 91 List.map 92 (\d -> 93 case Date.fromIsoString d of 94 Ok date -> 95 Date.add Date.Days wkoff date |> Date.toIsoString 96 97 Err _ -> 98 d 99 ) 100 s.dates 101 in 102 { startTime = startTime 103 , endTime = toLocal offset s.endTime 104 , weekdays = weekdays 105 , dates = dates 106 , dateCount = s.dateCount 107 } 108 109 110 scheduleToUTC : Int -> Schedule -> Schedule 111 scheduleToUTC offset s = 112 let 113 ( startTime, wkoff ) = 114 toLocalWkdayOffset (negate offset) s.startTime 115 116 weekdays = 117 List.map (applyWkdayOffset wkoff) s.weekdays |> List.sort 118 119 dates = 120 List.map 121 (\d -> 122 case Date.fromIsoString d of 123 Ok date -> 124 Date.add Date.Days wkoff date |> Date.toIsoString 125 126 Err _ -> 127 d 128 ) 129 (List.sort s.dates) 130 in 131 { startTime = startTime 132 , endTime = toUTC offset s.endTime 133 , weekdays = weekdays 134 , dates = dates 135 , dateCount = s.dateCount 136 } 137 138 139 applyWkdayOffset : Int -> Int -> Int 140 applyWkdayOffset off wkday = 141 let 142 new = 143 wkday + off 144 in 145 if new < 0 then 146 6 147 148 else if new > 6 then 149 0 150 151 else 152 new