2017-07-03 20 views
1

Ich erstelle die App "rails", und ich muss einen Kalender einfügen. Ich habe eine JSON-Daten, die einmal in der Woche zur App senden. JSON-Objekt hat so etwas wie diese:So erhalten Sie das Datum für den Wochentag Rubin

route: "Monday" 

oder

route: "Saturday" 

ich wie gewohnt Datum diesen Tag der Woche setzen muß (Datum jede Woche berechnet, seit dem Tag, als die JSON gesendet wurde), zum Beispiel JSON-Objekte gesendet heute, und an alle von ihnen sollte ich ein Datum geben, Routen: "Samstag" sollte mir 24-Juni-2017 geben. Hoffen Sie, dass Sie meine Frage verstehen :)

+1

heute (Tag Sie die Frage gestellt) 3 1 2017. letzter Samstag Juli, Juli, war der Samstag 2017. vorletztes war am 24. Juni 2017. so dass Sie wollen die Datum eines bestimmten Tages, eine Woche vorher? – eiko

Antwort

6

Um den aktuellen Tag in Rails zu erhalten, können Sie verwenden:

Date.today 

den vorherigen Samstag zu erhalten (seit heute Monday 3rd July ist, das ist Saturday 1st July) können Sie verwenden:

Date.today.beginning_of_week(:saturday) 

Or , wenn das, was Sie eigentlich wollten, war die vorherige Woche Samstag (Saturday 24th June), dann können Sie verwenden:

Date.today.weeks_ago(1).beginning_of_week(:saturday) 

Oder, wenn Sie bevorzugen:

1.week.ago.beginning_of_week(:saturday) 

... beachten Sie jedoch, dass die oben wird ein ActiveSupport::TimeWithZone Objekt anstatt ein Date Objekt zurückgeben - so wird etwas anders verhalten.

Lesen Sie die Dokumentation der Schienen - insbesondere die ActiveSupport extensions to ruby's Date class, um zu sehen, welche Methoden zur Verfügung stehen.

Wenn aus irgendeinem Grunde, Sie benötigen, um dies zu tun, in der reinen ruby (dh ohne die oben genannten ActiveSupport Erweiterungen, die mit rails gebündelt kommen), dann könnte man stattdessen verwenden, um die Date.parse method:

require 'date' 

Date.parse("Saturday") - 7 
    # => Sat, 01 Jul 2017 

Um Ihr Objekt Date (oder ein ähnliches Objekt) in das von Ihnen gewünschte Zeichenfolgenformat ("24-June-2017") zu konvertieren, können Sie die Methode strftime von Ruby verwenden:

(Date.parse("Saturday") - 7).strftime('%d-%B-%Y') 

In Schienen ist es ein common convention, solche benutzerdefinierten Datumsformate in einem Gebietsschema oder einem Initialisierer zu platzieren, um Wiederholungen zu vermeiden. Sie können dann nach Namen dieses Formats Referenz:

# config/initializers/date_formats.rb 
# (Call this whatever you want!) 
Date::DATE_FORMATS[:calendar] = '%d-%B-%Y' 

# Anywhere else in the rails app 
Date.today.beginning_of_week(:saturday).to_s(:calendar) 
    # => "01-July-2017" 
1

Wenn Sie mit irgendwelchen integrierten Paketen in Ruby arbeiten, ist es immer eine gute Idee, die Dokumentation für verfügbare Funktionen und Beispiele zu überprüfen. Für die Zeit, Ruby kommt mit einem bequemen Time Objekt, das viel von den Interaktionen, die wir mit Time tun, vereinfacht.

Zum Beispiel kann man die aktuelle Uhrzeit erhalten:

t = Time.now, kann man dann (t + 1.days).monday? oder (t + 2.days).day == 1. tun

Tage haben bereits int Werte entsprechen.

http://ruby-doc.org/core-2.4.1/Time.html

Diese Dokumentation bezieht sich auf die neueste Kopf, aber Sie können die Version für Ihr ruby mit ruby -v und finden Sie die passende Version finden, weil es Änderung über Versionen der Fall ist.

Für Ihre Frage, könnten Sie die URL den Zeichenfolge Montag verwenden und mit einem switch case oder hash den int eger Unterschied von heute ableiten, diesmal unter Verwendung könnte das genaue Kalenderdatum erhalten. Sobald es zu Time geparst wird, könnten Sie auch Time.monday?..Time.sunday? tun, die Sie möglicherweise nicht nützlich finden, wenn Sie versuchen, Ihr Problem zu lösen. Es gibt viele Möglichkeiten, es anzugehen, aber der Unterschied zu Heute ist eine gute Lösung und mit der Möglichkeit, Tage wie Time hinzuzufügen, fühlt es sich natürlich an, Ruby dazu zu benutzen.

2

Neben @TomLord Antwort:

Man kann es an welchem ​​Tag der Woche überprüfen ist, durch spezielles Verfahren unter Verwendung von monday? zu saturday?

zB :

Date.today 
# => Mon, 03 Jul 2017 
Date.today.monday? 
# => True 
Date.today.saturday? 
# => False 
+0

'" 2017-07-03T00: 00: 00 + 00: 00 "' hat nicht das Format '% Y-% m-% d'. Weder ist der angeforderte '" 24-Juni-2017 "'. –

+0

@TomLord '% Y-% m-% d' ist ** Teil ** des Formats RFC3339 (es ist der Anfang). Aber es ist nicht das von OP gestellte Format, dem stimme ich zu. Ich stelle dies in die Antwort, um anderen Benutzern anzuzeigen, dass einige Formate bereits definiert wurden und es keine Notwendigkeit gibt, 'strftime()' zu verwenden. In diesem Fall ist es jedoch notwendig. –

+0

@TomLord Ich habe nicht gesehen, dass Sie Ihre Antwort bearbeitet haben, um ein benutzerdefiniertes Datum mit 'strftime()' hinzuzufügen. Ich habe den Teil der Konvertierung gelöscht. –

Verwandte Themen