私はElm-replを実行して、言語をいじっています。
現在の時刻を確認したいのですが。どうすればいいですか?現在のライブラリでは不可能のようです。何故ですか?
編集:私はこれを助けるためにパッケージを作りました。 http://package.Elm-lang.org/packages/z5h/time-app
これはElm 0.15の周りで尋ねられました-Elm 0.17と0.18での違い:参照 Elm 0.17で現在の時刻を取得するにはどうすればよいですか/ 0.18?
私自身の質問を解決するために、各アクションのタイムスタンプを含むStartAppのバリアントを作成しました。
更新関数にはシグネチャがあります:update : action -> Time -> model -> (model, Effects action)
0.19の更新標準ライブラリを使用して現在の時刻を取得することはできません。Elm/time
を使用する必要があります。 0.18と同様に、必要なのは結果を処理するためのコマンドとメッセージだけです。
type Msg
= OnTime Time.Posix
getTime : Cmd Msg
getTime =
Task.perform OnTime Time.now
0.18の更新これは再び簡単になりました。これで必要なのは、結果を処理するためのコマンドとメッセージだけです。
type Msg
= OnTime Time
getTime : Cmd Msg
getTime =
Task.perform OnTime Time.now
これを見てください エリー
元の回答
0.17で、これはずっと簡単になりました。 タイムライブラリ にタスクがあります。たとえば、次のようになります。
Time.now
|> Task.Perform NoOp CurrentTime
The Timeパッケージ または The Dateパッケージ を使用できます。
これは、両方を使用する不自然な例です。
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
エルム0.19
Time.here
およびTime.now
の例 https://ellie-app.com/3f6X2DW4cbma1以下では、初期時間をunix time start 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
]
プログラム開始時の時間を知りたい場合は、次のようにすることができます。
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()
};
};
あなたのコード
programStart = Now.loadTime
Elmの現在の時刻で何かを行う方法については、 pdoherty926の回答 を参照してください。
Elm-repl
にはSignal
sを処理する機能がなく、時間は「時間とともに変化する」ため、シグナルです。私が知っているように、時間を取得するためのTask
もありません。また、replでタスクを実行する方法もありませんが、将来的には機能することを期待しています。
Elmで現在の時刻を操作するには、主に2つの方法が考えられます。
ネイティブモジュールを作成/使用して、現在の時刻をミリ秒単位で返す(または同じことを行うタスクを返す)関数を作成します。この方法は一般的に推奨されていません。 #2の方が良いアプローチだと思います。しかし、#1の例はここにあります: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.Elm (getCurrentTime
関数)
Elmアプリケーションアーキテクチャ( https://github.com/evancz/Elm-architecture-tutorial/ )を使用してプログラムを作成し、現在の時報を更新サイクルへの入力としてフィードして、更新します。選択したすべての間隔での新しい現在時刻を持つモデル。そうすれば、他のすべてのメソッドは、モデルから現在の時刻を同期的にフェッチできます。
サイモンHからの答え(0.18の場合)は私を正しい方向に導きましたが、実際にその時間で何かをする方法を理解するのにいくつかの問題がありました)。 (user2167582
は、同じことを尋ねるSimonの回答にコメントを追加します:どのように「タイムアウトを取得しますか?」)。
私の特定の問題は、サーバーへのPOSTの本文に現在の時刻を含めたいということでした。
私は最終的にそれを解決し、最終結果に非常に満足しました-Task.andThen
の使用は、postTime
関数でtimestamp
を「通常の」フロートとして使用できることを意味しました-valuedパラメーター(タスクが実行されるときです)。
私の完全なSO答えは ここ です。
以下は私が思いついた解決策です ここではエリーにあります :
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
}