Получить местное время человека по часовому поясу в вязе

Я новичок в elm, и я пытаюсь создать панель администратора, которая показывает список технической поддержки и их доступное время в соответствии с их местным временем и их рабочим временем. Список сторонников:

init flags =
    ( { supportUserList =
            [ { supportName = "Maynard Kaminski"
              , numberOfClient = 12
              , zone = "Europe/Moscow"
              , startTime = "9 am"
              , endTime = "1 pm"
              }
            , { supportName = "Belle Willett"
                , numberOfClient = 8
              , zone = "Canada/Eastern"
              , startTime = "2 pm"
              , endTime = "6 pm"
              }
            , { supportName = "Gaylene Hickson"
              , numberOfClient = 7
              , zone = "Africa/Nairobi"
              , startTime = "6 pm"
              , endTime = "10 pm"
              }
            , { supportName = "Cinthia Talbert"
              , numberOfClient = 4
              , zone = "Asia/Tokyo"
              , startTime = "2 pm"
              , endTime = "6 pm"
              }
            , { supportName = "Sydney Crenshaw"
              , numberOfClient = 7
              , zone = "Pacific/Honolulu"
              , startTime = "6 am"
              , endTime = "10 am"
              }
            ]
      }
    , Cmd.none
    )
viewSupporter : Supporter -> Html msg
viewSupporter supporter =
    li []
        [ text supporter.supportName
        , text " "
        , text " ("
        , text (String.fromInt (supporter.numberOfClient))
        , text ")"
        , text " "
        , text supporter.startTime
        , text " - "
        , text supporter.endTime
        , text " ("
        , text "local time ?"
        , text ")"
        ]

ожидаемый результат введите описание изображения здесь

Текущий результат введите описание изображения здесь

Я пытался проверить https://guide.elm-lang.org/effects/time.html и Как узнать текущее время в Элме?

Но так и не смог найти решение. Вот мой текущий код в Эйлли. Потратил почти 9 часов и не смог найти решение. Как я могу получить местное время человека по значению его часового пояса. Спасибо

Пожалуйста, включите всю необходимую информацию в сам пост. Использование внешних служб удобно для удобства, но не обязательно. См. Как спросить и, в частности, как создать минимальный воспроизводимый пример.

glennsl 20.03.2022 12:14

Извините, я обновил свой вопрос.

optic92 20.03.2022 16:45
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
2
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы захотите преобразовать эти строки zone в настоящие Time.Zone, что можно сделать с помощью Библиотека часовых поясов justinmimbs.

Затем вам нужно будет получить текущее время с помощью чего-то вроде Time.every и преобразовать его в местные части с помощью Time.Extra.posixToParts.

Некоторый пример кода:

module Main exposing (main)

import Browser
import Dict
import Html exposing (Html, li, text, ul)
import Time exposing (Month(..))
import Time.Extra
import TimeZone


type Msg
    = Tick Time.Posix


type alias Model =
    { now : Time.Posix }


type alias RawSupporter =
    { supportName : String
    , numberOfClient : Int
    , zone : String
    , startTime : String
    , endTime : String
    }


type alias Supporter =
    { supportName : String
    , numberOfClient : Int
    , zone : Maybe Time.Zone
    , rawZone : String
    , startTime : String
    , endTime : String
    }


rawSupporters : List RawSupporter
rawSupporters =
    [ { supportName = "Maynard Kaminski"
      , numberOfClient = 12
      , zone = "Europe/Moscow"
      , startTime = "9 am"
      , endTime = "1 pm"
      }
    , { supportName = "Belle Willett"
      , numberOfClient = 8
      , zone = "Canada/Eastern"
      , startTime = "2 pm"
      , endTime = "6 pm"
      }
    , { supportName = "Gaylene Hickson"
      , numberOfClient = 7
      , zone = "Africa/Nairobi"
      , startTime = "6 pm"
      , endTime = "10 pm"
      }
    , { supportName = "Cinthia Talbert"
      , numberOfClient = 4
      , zone = "Asia/Tokyo"
      , startTime = "2 pm"
      , endTime = "6 pm"
      }
    , { supportName = "Sydney Crenshaw"
      , numberOfClient = 7
      , zone = "Pacific/Honolulu"
      , startTime = "6 am"
      , endTime = "10 am"
      }
    ]


supporters : List Supporter
supporters =
    rawSupporters
        |> List.map
            (\raw ->
                { supportName = raw.supportName
                , numberOfClient = raw.numberOfClient
                , zone =
                    TimeZone.zones
                        |> Dict.get raw.zone
                        |> Maybe.map (\evaluate -> evaluate ())
                , rawZone = raw.zone
                , startTime = raw.startTime
                , endTime = raw.endTime
                }
            )


viewSupporter : Time.Posix -> Supporter -> Html msg
viewSupporter now supporter =
    let
        parts =
            supporter.zone
                |> Maybe.map
                    (\zone ->
                        Time.Extra.posixToParts zone now
                    )

        localTimeDisplay =
            case parts of
                Just { year, month, day, hour, minute, second, millisecond } ->
                    ([ [ year, monthNum month, day ]
                        |> List.map String.fromInt
                        |> String.join "-"
                     , [ hour, minute, second ]
                        |> List.map String.fromInt
                        |> String.join ":"
                     ]
                        |> String.join " "
                    )
                        ++ " (local time)"

                Nothing ->
                    "<Not a valid timezone: '" ++ supporter.rawZone ++ "'>"
    in
    [ supporter.supportName
    , " ("
    , String.fromInt supporter.numberOfClient
    , ") "
    , supporter.startTime
    , " - "
    , supporter.endTime
    , " "
    , localTimeDisplay
    ]
        |> List.map text
        |> li []


monthNum : Month -> Int
monthNum m =
    case m of
        Jan ->
            1

        Feb ->
            2

        Mar ->
            3

        Apr ->
            4

        May ->
            5

        Jun ->
            6

        Jul ->
            7

        Aug ->
            8

        Sep ->
            9

        Oct ->
            10

        Nov ->
            11

        Dec ->
            12


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Tick newTime ->
            ( { model | now = newTime }, Cmd.none )


view : Model -> Html Msg
view model =
    supporters
        |> List.map (viewSupporter model.now)
        |> ul []


main : Program () Model Msg
main =
    Browser.element
        { init = \() -> ( { now = Time.millisToPosix 0 }, Cmd.none )
        , view = view
        , update = update
        , subscriptions = \_ -> Time.every 1000 Tick
        }

Вот тот же код работает на ellie-app.com.

Другие вопросы по теме