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