2015-04-05 13 views
16

Ich renne elm-repl, um mit der Sprache herumzuspielen.Wie bekomme ich die aktuelle Zeit in Elm?

Ich würde gerne sehen, wie die aktuelle Zeit ist. Wie würde ich das tun? Mit der aktuellen Bibliothek scheint dies nicht möglich zu sein. Warum das?


EDIT: Ich machte ein Paket, um dabei zu helfen. http://package.elm-lang.org/packages/z5h/time-app

Dieses wurde um fragte Ulme 0,15 - die Dinge anders in Ulme 0,17 & 0,18: siehe How do I get the current time in Elm 0.17/0.18?

+0

Ein paar Arbeitsbeispiele: http://StackOverflow.com/A/35120279/480608 (mit Elm v0.16.0). –

+0

Mögliches Duplikat von [Wie bekomme ich die aktuelle Zeit in Elm 0.17/0.18?] (Http://stackoverflow.com/questions/38021777/how-do-i-get-the-current-time-in-el-m- 0-17-0-18) – clozach

Antwort

8

Um meine eigene Frage zu lösen, habe ich eine Variante von StartApp erstellt, die einen Zeitstempel für jede Aktion enthält.
So ist die Update-Funktion hat Unterschrift:
update : action -> Time -> model -> (model, Effects action)

Der Gist ist hier. https://gist.github.com/z5h/41ca436679591b6c3e51

+0

Dies ist ein cooler Ansatz, auch! – splodingsocks

+0

@splodingsocks Dank. Ich habe es noch nicht aktualisiert, um mit den neuesten Elm und verwandten Bibliotheken zu arbeiten, aber hoffentlich kommt die Idee durch. – z5h

+1

@splodingsocks Ich habe es endlich aktualisiert, um mit den neuesten Elm-Bibliotheken zu arbeiten. – z5h

10

Sie the Time package und/oder the Date package verwenden können.

Hier ist ein konstruiertes Beispiel, die beide verwendet:

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 
+1

Das beantwortet leider meine eigene Frage nicht, die einfach "wie bekomme ich die aktuelle Zeit in Ulm". Dies beantwortet stattdessen die Frage, "wie kann ich eine Aufgabe auf einer Zeitfrequenzbasis ausführen, mit der Zeit in sie hinein". Kann dieser Ansatz angepasst werden, um den Fall "Aufruf einer Funktion und Rückgabe der aktuellen Systemzeit" zu lösen? –

+1

@TomKludy Ich denke nicht, was Sie anfordern, ist möglich, da diese Funktion notwendigerweise unrein wäre. Per @ Apanatshkas Punkt, könnten Sie eine 'Task' verwenden und einen Callback übergeben, der die Zeit nach dem Systemaufruf erhalten würde, oder eine' Task' und eine 'Mailbox' verwenden, die dazu führen, dass der Wert zurückgesendet wird in Ihr Programm, nachdem es verfügbar ist. Siehe [Verkettung von Aufgaben] (http://elm-lang.org/guide/reactivity#chaining-tasks) und [Kommunikation mit Postfächern] (http://elm-lang.org/guide/reactivity#communicating-with-mailboxes) [hier] (http://elm-lang.org/guide/reactivity). – pdoherty926

+6

Ich denke, das ist eines dieser spezifischen Dinge, die Praktizierende schnell davon abhalten würden, eine funktionale Sprache zu benutzen. Sie schreiben Ihnen einen Decoder, um Ihre eingehenden Nachrichten zu parsen, und im Prinzip haben Sie keine elegante Möglichkeit, einen Zeitstempel auf sie zu kleben, es sei denn, sie kommen bereits mit einem. Es fühlt sich ein bisschen wie das Smartphone an, wo man nur jemanden anrufen kann, wenn man sie zuerst als Kontakt hinzufügt ... – Gabor

4

Sie sehen pdoherty926's answer, wie etwas mit der aktuellen Zeit in Elm zu tun.

elm-repl hat nicht die Fähigkeit, mit Signal s zu arbeiten, und Zeit "ändert sich im Laufe der Zeit", so ist es ein Signal. Es gibt auch keine Task für die Zeit, die ich kenne. Noch ein Weg, um Aufgaben im Repl auszuführen, obwohl ich erwarte, dass das Feature in der Zukunft sein wird.

+0

Könnten Sie Ihre Antwort jetzt aktualisieren, nachdem wir Elm 0,15 überschritten haben? –

+0

@TheOddler getan – Apanatshka

5

Wenn Sie die Zeit als Programm wollen starten Sie Folgendes ausführen können:

Now.elm

module Now where 

import Native.Now 

loadTime : Float 
loadTime = Native.Now.loadTime 

Nativ/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() 
    }; 

}; 

Ihr Code

programStart = Now.loadTime 
+0

Ich glaube nicht, dass das funktioniert nicht mehr. –

+0

Ich habe das zur Arbeit, die mein Problem gelöst hat. Vielen Dank! Der Schlüssel war die folgend in meiner Ulme-package.json enthalten: '„native-Module“: true' –

1

Es gibt zwei Möglichkeiten, wie ich denken kann, mit der aktuellen Zeit in Elm zu arbeiten:

  1. schreiben/verwenden, um ein systemeigenes Modul eine Funktion zu machen, die die aktuelle Zeit in ms zurückgibt (oder gibt eine Aufgabe zurück, die dasselbe tut. Diese Methode wird im Allgemeinen nicht empfohlen. Ich denke, # 2 ist ein besserer Ansatz. Aber ein Beispiel # 1 ist hier zu finden: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.elm (siehe getCurrentTime Funktion)

  2. Schreiben Sie ein Programm der Elm Anwendungsarchitektur (https://github.com/evancz/elm-architecture-tutorial/) verwendet wird, und dann führen Sie das aktuelle Zeitsignal als Eingang zu dem Update-Zyklus, Aktualisieren des Modells mit der neuen aktuellen Uhrzeit in jedem von Ihnen gewählten Intervall.Dann können alle anderen Methoden die aktuelle Zeit synchron vom Modell abrufen.

+1

Aufbauend auf Idee # 2, was meiner Meinung nach am besten: 'Art Action = Tick Zeit | ... 'und im Update:' Tick time -> {model | Zeit = Zeit} '. – mgold

14

Update für 0,18 Dies hat wieder einfacher bekam. Alles was Sie jetzt brauchen, ist ein Befehl und Msg das Ergebnis

type Msg 
    = OnTime Time 

getTime : Cmd Msg 
getTime = 
    Task.perform OnTime Time.now 

Sehen Sie diese Ellie

Ursprüngliche Antwort

Mit 0,17 zu handhaben, bekam dies eine ganze Reihe einfacher. Es gibt jetzt eine Aufgabe in der Time library. So haben wir jetzt zum Beispiel:

Time.now 
|> Task.Perform NoOp CurrentTime 
+0

Für jeden Nutzen habe ich die Frage noch einmal gefragt (0,17) hier http://stackoverflow.com/q/38021777/131227. So wie ich es sehe, ist, dass es einfach ist, die Zeit zu erhalten, wie es Ihnen zeigen.Aber es ist viel trüger (unmöglich), die Zeit zu bekommen, in der eine beliebige Nachricht auftrat. Viele Apps haben diese Art von Buchhaltungsanforderungen, bei denen die Werte "created_at" oder "updated_at" beibehalten werden. – z5h

+0

'{type =" leaf ", home =" Aufgabe ", Wert = Führen } : Platform.Cmd.Cmd Repl.Msg' Wie erhalten Sie die tatsächliche' Zeit'? – user2167582

+0

Werfen Sie einen Blick auf die Ellie verbunden mit –

Verwandte Themen