time - satelital - ¿Cómo obtengo la hora actual en Elm?
utc mexico (8)
Elm 0.19
-
Time.here
yTime.now
https://ellie-app.com/3f6X2DW4cbma1 - Ejemplo de reloj svg analógico https://ellie-app.com/3dYXjr3bJNWa1
A continuación, establezco el tiempo inicial como tiempo de inicio de Unix Time.millisToPosix 0
, pero puede establecerlo en Nothing
y, posteriormente, en Just time
o pasarlo con 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
]
Estoy corriendo elm-repl para jugar con el lenguaje.
Me gustaría ver cuál es la hora actual. ¿Como podría hacerlo? No parece ser posible con la biblioteca actual. ¿Porqué es eso?
EDITAR: He hecho un paquete para ayudar con esto. http://package.elm-lang.org/packages/z5h/time-app
Esto se preguntó alrededor de elm 0.15 - las cosas son diferentes en elm 0.17 y 0.18 : consulte ¿Cómo obtengo la hora actual en Elm 0.17 / 0.18?
Hay dos formas principales en las que puedo pensar para trabajar con la hora actual en Elm:
Escriba / use un módulo nativo para hacer una función que devuelva la hora actual en ms (o devuelva una tarea que hará lo mismo). Este método no es generalmente recomendado. Creo que # 2 es un mejor enfoque. Pero se puede encontrar un ejemplo de # 1 aquí: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.elm (consulte la función
getCurrentTime
)Escriba un programa utilizando la arquitectura de la aplicación Elm ( https://github.com/evancz/elm-architecture-tutorial/ ), y luego alimente la señal de tiempo actual como una entrada al ciclo de actualización, actualizando el modelo con la nueva hora actual en cada intervalo de su elección. Luego, todos sus otros métodos pueden obtener la hora actual de manera sincrónica fuera del modelo.
La respuesta (para 0.18) de Simon H me hizo comenzar en la dirección correcta, pero tuve algunos problemas para resolver cómo hacer algo en ese momento . ( user2167582
agrega un comentario a la respuesta de Simon, que pregunta lo mismo: ¿cómo se "quita el tiempo?").
Mi problema específico fue que quería incluir la hora actual en el cuerpo de un POST al servidor.
Finalmente lo resolví y quedé bastante satisfecho con el resultado final: el uso de Task.andThen
lo Task.andThen
significaba que en mi función de tiempo postTime
solo puedo usar la timestamp
como un parámetro ''regular'' de valor flotante (que es cuando se ejecuta la tarea , Supongo).
Mi respuesta completa está here .
A continuación se muestra la solución que se me ocurrió y aquí está en 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
}
Para resolver mi propia pregunta, he creado una variante de StartApp que incluye una marca de tiempo en cada acción.
Así que la función de actualización tiene firma:
update : action -> Time -> model -> (model, Effects action)
La esencia está aquí. https://gist.github.com/z5h/41ca436679591b6c3e51
Puede utilizar el paquete de tiempo y / o el paquete de fecha .
Aquí hay un ejemplo artificial que usa ambos:
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
Puede ver la respuesta de pdoherty926 sobre cómo hacer algo con la hora actual en Elm.
elm-repl
no tiene la capacidad de trabajar con Signal
s, y la hora "cambia con el tiempo", por lo que es una señal. Tampoco hay una Task
para obtener el tiempo, que yo sepa. Tampoco es una forma de ejecutar tareas en la respuesta, aunque espero que sea una característica en el futuro.
Si desea que la hora a partir del inicio del programa puede hacer lo siguiente:
Ahora.elm
module Now where
import Native.Now
loadTime : Float
loadTime = Native.Now.loadTime
Nativo / 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()
};
};
tu codigo
programStart = Now.loadTime
Actualización para 0.18 Esto se ha vuelto más simple nuevamente. Ahora todo lo que necesitas es un comando y Msg para manejar el resultado
type Msg
= OnTime Time
getTime : Cmd Msg
getTime =
Task.perform OnTime Time.now
Ver esto Ellie
Respuesta original
Con 0.17, esto es mucho más fácil. Ahora hay una tarea en la biblioteca de tiempo . Así, por ejemplo, ahora tenemos:
Time.now
|> Task.Perform NoOp CurrentTime