我正在运行elm-repl来玩这种语言。
我想看看现在的时间。我该怎么办?目前的库似乎无法实现。那是为什么?
这被问到榆树0.15周围 - 榆树0.17& 0.18 :见How do I get the current time in Elm 0.17/0.18?
答案 0 :(得分:16)
更新0.18 这再次变得更简单了。现在您只需要一个命令和Msg来处理结果
type Msg
= OnTime Time
getTime : Cmd Msg
getTime =
Task.perform OnTime Time.now
请参阅此Ellie
原始回答
0.17,这变得更容易了。现在Time library中有一个任务。例如,我们现在有:
Time.now
|> Task.Perform NoOp CurrentTime
答案 1 :(得分:11)
您可以使用the Time package和/或the Date package。
这是一个使用两者的人为例子:
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
答案 2 :(得分:8)
要解决我自己的问题,我已经创建了一个StartApp变体,其中包含每个操作的时间戳。
所以更新功能有签名:
update : action -> Time -> model -> (model, Effects action)
答案 3 :(得分:5)
如果您想要程序启动时间,您可以执行以下操作:
Now.elm
module Now where
import Native.Now
loadTime : Float
loadTime = Native.Now.loadTime
本地/ 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()
};
};
您的代码
programStart = Now.loadTime
答案 4 :(得分:5)
榆木0.19
Time.here
和Time.now
示例https://ellie-app.com/3f6X2DW4cbma1 在下面,我将初始时间设置为unix时间开始Time.millisToPosix 0
,但是您可以将其设置为Nothing
,然后再设置为Just time
或用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
]
答案 5 :(得分:4)
您可以看到pdoherty926's answer了解如何使用榆树当前时间做某事。
elm-repl
没有能力使用Signal
,时间和#34;随时间变化&#34;所以这是一个信号。
我知道,也没有Task
来获得时间。也不是在repl中执行任务的方法,尽管我希望将来会有这个功能。
答案 6 :(得分:1)
我可以想到两种主要方式来处理Elm当前的时间:
编写/使用本机模块创建一个以ms为单位返回当前时间的函数(或返回将执行相同操作的任务)。通常不建议使用此方法。我认为#2是一种更好的方法。但是可以在此处找到#1的示例:https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.elm(请参阅getCurrentTime
函数)
使用Elm应用程序架构(https://github.com/evancz/elm-architecture-tutorial/)编写程序,然后将当前时间信号作为输入提供给更新周期,每隔一段时间用新的当前时间更新模型选择。然后,所有其他方法都可以从模型中同步获取当前时间。
答案 7 :(得分:0)
Simon H的答案(对于0.18)使我朝着正确的方向开始,但是我在确定如何在这段时间内实际做某事时遇到了一些麻烦。 ({user2167582
在Simon的回答中添加了注释,问同样的问题:您如何“度过时间?”。)
我的具体问题是我想将当前时间包含在服务器的POST正文中。
我最终解决了这个问题,并对最终结果感到非常满意-使用Task.andThen
意味着我可以在postTime
函数中将timestamp
用作“常规”浮点型参数(我想应该是任务运行时的参数)。
我的完整答案是here。
下面是我想出的解决方案,here it is in 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
}