我如何获得榆树当前时间?

时间:2015-04-05 02:59:13

标签: time elm

我正在运行elm-repl来玩这种语言。

我想看看现在的时间。我该怎么办?目前的库似乎无法实现。那是为什么?


编辑:我做了一个包来帮助解决这个问题。 http://package.elm-lang.org/packages/z5h/time-app

这被问到榆树0.15周围 - 榆树0.17& 0.18 :见How do I get the current time in Elm 0.17/0.18?

8 个答案:

答案 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)

要点就在这里。 https://gist.github.com/z5h/41ca436679591b6c3e51

答案 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

在下面,我将初始时间设置为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当前的时间:

  1. 编写/使用本机模块创建一个以ms为单位返回当前时间的函数(或返回将执行相同操作的任务)。通常不建议使用此方法。我认为#2是一种更好的方法。但是可以在此处找到#1的示例:https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.elm(请参阅getCurrentTime函数)

  2. 使用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
        }