web-dev-qa-db-fra.com

Comment puis-je obtenir l'heure actuelle à Elm?

Je lance Elm-repl pour jouer avec la langue.

J'aimerais voir quelle est l'heure actuelle. Comment je ferais ça? Cela ne semble pas être possible avec la bibliothèque actuelle. Pourquoi donc?


EDIT: J'ai fait un paquet pour aider avec ceci. http://package.Elm-lang.org/packages/z5h/time-app

Cela a été demandé autour d'Elm 0.15 - les choses sont différentes dans Elm 0.17 & 0.18 : see Comment obtenir l'heure actuelle dans Elm 0.17/0.18?

17
z5h

Pour résoudre ma propre question, j'ai créé une variante de StartApp qui inclut un horodatage pour chaque action.
La fonction de mise à jour a donc une signature:
update : action -> Time -> model -> (model, Effects action)

The Gist is here. https://Gist.github.com/z5h/41ca436679591b6c3e51

8
z5h

Mise à jour pour 0.18 Ceci est redevenu plus simple. Maintenant, tout ce dont vous avez besoin est d’une commande et d’un message pour gérer le résultat.

type Msg
    = OnTime Time 

getTime : Cmd Msg
getTime = 
    Task.perform OnTime Time.now 

Voir ceci Ellie

Réponse originale

Avec 0,17, cela est devenu beaucoup plus facile. Il y a maintenant une tâche dans la bibliothèque Time . Ainsi, par exemple, nous avons maintenant:

Time.now
|> Task.Perform NoOp CurrentTime
16
Simon H

Vous pouvez utiliser le paquet Time et/ou le paquet Date .

Voici un exemple artificiel qui utilise les deux:

import Signal
import Time exposing (every, second)
import Date exposing (year, hour, minute, second, fromTime)
import Graphics.Element exposing (show)

main =
  Signal.map currentTime (Time.every Time.second)

currentTime t =
  let date' = fromTime t
      hour' = toString (Date.hour date')
      minute' = toString (Date.minute date')
      second' = toString (Date.second date')
      year' = toString (year date')
      now = "The current time is: " ++ hour' ++ ":" ++ minute' ++ ":" ++ second'
  in 
      show now
11
pdoherty926

Si vous souhaitez que l’heure commence au début du programme, vous pouvez procéder comme suit:

Now.Elm

module Now where

import Native.Now

loadTime : Float
loadTime = Native.Now.loadTime

Native/Now.js

Elm.Native.Now = {};

Elm.Native.Now.make = function(localRuntime) {

  localRuntime.Native = localRuntime.Native || {};


  localRuntime.Native.Now = localRuntime.Native.Now || {};

  if (localRuntime.Native.Now.values) {
    return localRuntime.Native.Now.values;
  }

  var Result = Elm.Result.make(localRuntime);

  return localRuntime.Native.Now.values = {
    loadTime: (new window.Date).getTime()
  };

};

votre code

programStart = Now.loadTime
5
case nelson

Orme 0,19

Ci-dessous, je définis l'heure initiale comme heure unix, démarrer Time.millisToPosix 0, mais vous pouvez le définir sur Nothing et, plus tard, sur Just time ou le transmettre avec Flag.

module Main exposing (main)

import Browser
import Html exposing (Html)
import Task
import Time exposing (Posix)


main : Program () Model Msg
main =
    Browser.element
        { init = \_ -> init
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }



-- MODEL


type alias Model =
    { zone : Time.Zone
    , now : Posix
    }


init : ( Model, Cmd Msg )
init =
    ( Model Time.utc (Time.millisToPosix 0), Task.perform Zone Time.here )



-- UPDATE


type Msg
    = Zone Time.Zone
    | Now Posix


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Zone zone ->
            ( { model | zone = zone }, Task.perform Now Time.now )

        Now now ->
            ( { model | now = now }, Cmd.none )



-- VIEW


formatTime zone posix =
    (String.padLeft 2 '0' <| String.fromInt <| Time.toHour zone posix)
        ++ ":"
        ++ (String.padLeft 2 '0' <| String.fromInt <| Time.toMinute zone posix)
        ++ ":"
        ++ (String.padLeft 2 '0' <| String.fromInt <| Time.toSecond zone posix)


view : Model -> Html Msg
view model =
    Html.div []
        [ Html.text <| formatTime model.zone model.now
        ]
4
rofrol

Vous pouvez voir la réponse de pdoherty926 pour savoir comment faire quelque chose avec l'heure actuelle à Elm.

Elm-repl n'a pas la capacité de travailler avec Signals, et le temps "change dans le temps", donc c'est un signal. Il n’existe pas non plus de Task pour avoir le temps, à ma connaissance. Ni un moyen d'exécuter des tâches dans le repl, bien que je m'attende à ce que ce soit le cas dans le futur. 

4
Apanatshka

Je peux envisager de travailler avec le temps présent à Elm de deux manières principales:

  1. Écrire/utiliser un module natif pour créer une fonction qui renvoie l’heure actuelle en ms (ou une tâche qui fera de même). Cette méthode n'est généralement pas recommandée. Je pense que # 2 est une meilleure approche. Mais un exemple de # 1 peut être trouvé ici: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.Elm (voir la fonction getCurrentTime)

  2. Écrivez un programme utilisant l’architecture d’application Elm ( https://github.com/evancz/Elm-architecture-tutorial/ ), puis transmettez le signal de temps actuel comme entrée du cycle de mise à jour, en mettant à jour le modèle la nouvelle heure actuelle à chaque intervalle de votre choix. Ensuite, toutes vos autres méthodes peuvent simplement extraire l'heure actuelle de manière synchrone hors du modèle.

1
Murphy Randle

La réponse (pour 0,18) de Simon H m'a fait commencer dans la bonne direction, mais j'ai eu du mal à comprendre comment faire quelque chose avec ce moment . (user2167582 ajoute un commentaire à la réponse de Simon qui demande la même chose: comment obtenez-vous le temps mort? ').

Mon problème spécifique était que je voulais inclure l'heure actuelle dans le corps d'un POST sur le serveur.

J'ai finalement résolu le problème et je suis assez satisfait du résultat final. L'utilisation de Task.andThen signifiait que, dans ma fonction postTime, je pouvais simplement utiliser timestamp comme paramètre 'régulier' à valeur float (ce qui est le cas lorsque la tâche est exécutée, I supposer).

Ma réponse complète SO est ici .

Voici la solution que j'ai trouvée et la voici dans Ellie :

module Main exposing (..)

import Html exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as JD
import Json.Encode as JE
import Task
import Time


type alias Model =
    { url : String
    }


type Msg
    = PostTimeToServer
    | PostDone (Result Http.Error String)


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        PostTimeToServer ->
            ( model, postTimeToServer model.url )

        PostDone _ ->
            ( model, Cmd.none )


view : Model -> Html Msg
view model =
    div []
        [ div []
            [ button [ onClick PostTimeToServer ] [ Html.text "POST the current time." ]
            ]
        ]


postTimeToServer : String -> Cmd Msg
postTimeToServer url =
    let
        getTime =
            Time.now

        postTime t =
            JD.string
                |> Http.post url (JE.float t |> Http.jsonBody)
                |> Http.toTask

        request =
            getTime                                            <<-- Here is
                |> Task.andThen postTime                       <<-- the key bit.
    in
        Task.attempt PostDone request


main =
    Html.program
        { init = ( Model "url_here", Cmd.none )
        , update = update
        , view = view
        , subscriptions = always Sub.none
        }
0
Robert