web-dev-qa-db-ja.com

Elmの現在時刻を取得するにはどうすればよいですか?

私はElm-replを実行して、言語をいじっています。

現在の時刻を確認したいのですが。どうすればいいですか?現在のライブラリでは不可能のようです。何故ですか?


編集:私はこれを助けるためにパッケージを作りました。 http://package.Elm-lang.org/packages/z5h/time-app

これはElm 0.15の周りで尋ねられました-Elm 0.17と0.18での違い:参照 Elm 0.17で現在の時刻を取得するにはどうすればよいですか/ 0.18?

20
z5h

私自身の質問を解決するために、各アクションのタイムスタンプを含むStartAppのバリアントを作成しました。
更新関数にはシグネチャがあります:
update : action -> Time -> model -> (model, Effects action)

要旨はこちらです。 https://Gist.github.com/z5h/41ca436679591b6c3e51

8
z5h

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
17
Simon H

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
11
pdoherty926

エルム0.19

以下では、初期時間を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
        ]
5
rofrol

プログラム開始時の時間を知りたい場合は、次のようにすることができます。

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
5
case nelson

Elmの現在の時刻で何かを行う方法については、 pdoherty926の回答 を参照してください。

Elm-replにはSignalsを処理する機能がなく、時間は「時間とともに変化する」ため、シグナルです。私が知っているように、時間を取得するためのTaskもありません。また、replでタスクを実行する方法もありませんが、将来的には機能することを期待しています。

4
Apanatshka

Elmで現在の時刻を操作するには、主に2つの方法が考えられます。

  1. ネイティブモジュールを作成/使用して、現在の時刻をミリ秒単位で返す(または同じことを行うタスクを返す)関数を作成します。この方法は一般的に推奨されていません。 #2の方が良いアプローチだと思います。しかし、#1の例はここにあります: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.ElmgetCurrentTime 関数)

  2. Elmアプリケーションアーキテクチャ( https://github.com/evancz/Elm-architecture-tutorial/ )を使用してプログラムを作成し、現在の時報を更新サイクルへの入力としてフィードして、更新します。選択したすべての間隔での新しい現在時刻を持つモデル。そうすれば、他のすべてのメソッドは、モデルから現在の時刻を同期的にフェッチできます。

1
Murphy Randle

サイモン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
        }
0
Robert