Time 如何获取Elm的当前时间?

Time 如何获取Elm的当前时间?,time,elm,Time,Elm,我正在运行elm repl来处理这种语言 我想看看现在是什么时间。我该怎么做?对于当前库,这似乎不可能。为什么呢 编辑:我制作了一个软件包来帮助这项工作 这是关于elm 0.15-的问题,elm 0.17和0.18中的情况有所不同:请参见您可以使用和/或 下面是一个人为的示例,它同时使用了以下两种方法: import Signal import Time exposing (every, second) import Date exposing (year, hour, minute, sec

我正在运行elm repl来处理这种语言

我想看看现在是什么时间。我该怎么做?对于当前库,这似乎不可能。为什么呢


编辑:我制作了一个软件包来帮助这项工作

这是关于elm 0.15-的问题,elm 0.17和0.18中的情况有所不同:请参见您可以使用和/或

下面是一个人为的示例,它同时使用了以下两种方法:

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
您可以在Elm中查看如何使用当前时间执行某些操作

elm repl
无法处理
信号
s,时间“随时间变化”,因此它是一个信号。
据我所知,这里也没有一个
任务
来获取时间。也不是在repl中执行任务的方法,尽管我希望这将是将来的特性

如果您需要程序启动的时间,可以执行以下操作:

现在,埃尔姆

Native/Now.js

你的代码


为了解决我自己的问题,我创建了StartApp的一个变体,它在每个操作上都包含一个时间戳。
因此更新函数具有签名:
更新:动作->时间->模型->(模型,效果动作)

要点在这里。

在Elm中,我可以想到两种处理当前时间的主要方法:

  • 编写/使用本机模块生成以毫秒为单位返回当前时间的函数(或返回将执行相同操作的任务)。一般不推荐使用这种方法。我认为#2是一个更好的方法。但是#1的一个例子可以在这里找到:(参见
    getCurrentTime
    函数)

  • 使用Elm应用程序体系结构()编写一个程序,然后将当前时间信号作为更新周期的输入,在您选择的每个间隔使用新的当前时间更新模型。然后,所有其他方法都可以从模型中同步获取当前时间


  • 更新0.19无法使用标准库获取当前时间。。您需要使用
    elm/time
    。与0.18一样,您只需要一个命令和消息来处理结果

    type Msg
        = OnTime Time.Posix 
    
    getTime : Cmd Msg
    getTime = 
        Task.perform OnTime Time.now 
    
    type Msg
        = OnTime Time 
    
    getTime : Cmd Msg
    getTime = 
        Task.perform OnTime Time.now 
    
    更新为0.18这又变得简单了。现在,您只需要一个命令和消息来处理结果

    type Msg
        = OnTime Time.Posix 
    
    getTime : Cmd Msg
    getTime = 
        Task.perform OnTime Time.now 
    
    type Msg
        = OnTime Time 
    
    getTime : Cmd Msg
    getTime = 
        Task.perform OnTime Time.now 
    
    看到这个了吗

    原始答案

    如果是0.17,这就容易多了。现在在中有一个任务。例如,我们现在有:

    Time.now
    |> Task.Perform NoOp CurrentTime
    
    Simon H给出的答案(0.18)让我朝着正确的方向开始了,但我确实遇到了一些困难,无法确定如何在这段时间内真正做一些事情。(
    user2167582
    在Simon的回答中添加了一条注释,该注释提出了同样的问题:如何“获得超时时间?”)

    我的具体问题是,我想在发送到服务器的帖子正文中包含当前时间

    我最终解决了这个问题,并对最终结果非常满意——使用了
    任务。然后
    意味着我在
    postTime
    函数中可以使用
    timestamp
    作为“常规”浮点值参数(我想在任务运行时就是这样)

    我的完整答案是

    以下是我提出的解决方案:

    模块主显示(…)
    导入Html公开(…)
    导入Html.Events公开(..)
    导入Http
    导入Json。解码为JD
    导入Json.Encode为JE
    导入任务
    导入时间
    类型别名模型=
    {url:String
    }
    输入味精
    =PostTimeToServer
    |PostDone(结果Http.Error字符串)
    更新:Msg->Model->(Model,Cmd-Msg)
    更新msg模型=
    味精案例
    PostTimeToServer->
    (模型,postTimeToServer model.url)
    PostDone->
    (型号,Cmd.none)
    查看:模型->Html消息
    视图模型=
    分区[]
    [部门[]
    [按钮[单击PostTimeToServer][Html.text“发布当前时间”。]
    ]
    ]
    postTimeToServer:String->Cmd Msg
    postTimeToServer url=
    让
    盖蒂姆=
    时间到了
    加时t=
    JD.string
    |>Http.post url(JE.float t |>Http.jsonBody)
    |>Http.toTask
    请求=
    getTimeElm 0.19

    • 时间
    • 模拟svg时钟
    下面我将初始时间设置为unix时间开始
    time.millisToPosix 0
    ,但您可以将其设置为
    ,稍后设置为
    仅时间
    ,或者使用
    标志传递它

    模块主显示(主)
    导入浏览器
    导入Html(Html)
    导入任务
    导入时间曝光(Posix)
    main:Program()模型Msg
    主要=
    浏览器.element
    {init=\\->init
    ,视图=视图
    ,update=update
    ,订阅=\ \->Sub.none
    }
    --模型
    类型别名模型=
    {zone:Time.zone
    ,现在:Posix
    }
    初始化:(模型,Cmd Msg)
    初始化=
    (Model Time.utc(Time.millisToPosix 0),Task.perform Zone Time.here)
    --更新
    输入味精
    =区域时间。区域
    |现在是Posix
    更新:Msg->Model->(Model,Cmd-Msg)
    更新msg模型=
    味精案例
    区域->
    ({model | zone=zone},Task.perform Now Time.Now)
    现在->
    ({model | now=now},Cmd.none)
    --看法
    格式化时区posix=
    
    (String.padLeft 2'0'很遗憾,这并没有回答我自己的问题,这只是“如何获取elm中的当前时间”。这是在回答“如何在时间频率的基础上执行任务,并将时间传递到任务中”。这种方法能否适应于解决以下问题:“调用函数并返回当前系统时间“?@TomKludy我认为您的请求是不可能的,因为该函数必然是不纯净的。根据@Apanatshka的观点,您可以使用
    任务
    并传递回调,该回调将接收系统调用后的时间,或者使用
    任务
    邮箱Time.now
    |> Task.Perform NoOp CurrentTime
    
    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
            }